GoogleMap.MarkerClick event fired more than one time - android

I'm using Xamarin Android, and I have different Marker in the map, I'd like that when I select one of these Marker the camera moves to the Marker and it opens the InfoWindow, now when I click the marker a lot of event are fired, like six, the map moves to the marker , it opens the infowindow but it closes it right away. This is the code I'm using:
_map.Clear ();
var infoWindow = new InformationWindow ();
_map.SetInfoWindowAdapter(infoWindow);
_map.MarkerClick += HandleMarkerClick;
.
.
void HandleMarkerClick (object sender, GoogleMap.MarkerClickEventArgs e)
{
Console.WriteLine ("CLICK MArker"+e.Marker.Id);
}
The same happens with the InfoWindowClick, by the way for now I'm just trying to figure out why this behaviour.

Have you set the markerClickEventArgs.Handled to be true?
The sample code for Marker Click Eventsas following:
private void MapOnMarkerClick(object sender, GoogleMap.MarkerClickEventArgs markerClickEventArgs)
{
markerClickEventArgs.Handled = true;
Marker marker = markerClickEventArgs.P0;
if (marker.Id.Equals(MyMarkerId)) // The ID of a specific marker the user clicked on.
{
_map.AnimateCamera(CameraUpdateFactory.NewLatLngZoom(new LatLng(20.72110, -156.44776), 13));
}
else
{
Toast.MakeText(this, String.Format("You clicked on Marker ID {0}", marker.Id), ToastLength.Short).Show();
}
}
For more details, please refer to here.

Related

Android get properties for polygon from GeoJson

Im adding GeoJsonLayer to Google map on my application. This json contains coordinates for polygon and properties for each polygon. What I need is to get those properties when polygon is clicked. This is the code Im using to achieve that.
GeoJsonLayer jsonLayer = new GeoJsonLayer(mMap, geoJSON);
jsonLayer.addLayerToMap();
jsonLayer.setOnFeatureClickListener(new GeoJsonLayer.GeoJsonOnFeatureClickListener() {
#Override
public void onFeatureClick(final com.google.maps.android.data.Feature feature) {
mMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
#Override
public void onPolygonClick(Polygon polygon) {
for (Object s : feature.getProperties()) {
Log.d("getProperties", "getProperties = " + s.toString());
}
}
});
}
});
The problem is that it returns all properties. I want it to return properties only for the polygon I clicked.
Also its possible to draw polygons with user input. When I click on those polygons it triggers onPolygonClick() inside jsonLayer.setOnFeatureClickListener(). How to check if clicked polygon is from jsonLayer?

Make graphics clickable instead of create new graphics in map

So, I have a map with a MapOnTouchListener on it. I have overriden the OnSingleTap method (allPoints is an array where all markers are added for a non related to this question functionality):
#Override
public boolean onSingleTap(MotionEvent point) {
Point mapPoint=view.toMapPoint(point.getX(), point.getY());
new GeocoderAsynckTask(mapPoint,view).execute(mapPoint);
SpatialReference sp = SpatialReference.create(SpatialReference.WKID_WGS84);
Point p1Done=(Point) GeometryEngine.project(mapPoint, mvHelper.getMapView().getSpatialReference(), sp);
allPoints.add(p1Done);
return super.onSingleTap(point);
}
That GeoCoderAsyncTask translates the coords of the point to an address, and adds a marker to the map. The geocoding is done just right, I get my address and in PostExecute method I add the marker to the map:
protected void onPostExecute(String address) {
mProgressDialog.dismiss();
Toast.makeText(ctx,address,Toast.LENGTH_LONG).show();
SpatialReference sp = SpatialReference.create(SpatialReference.WKID_WGS84);
Point p1Done=(Point) GeometryEngine.project(point, mvHelper.getMapView().getSpatialReference(), sp);
mvHelper.addMarkerGraphic(p1Done.getY(), p1Done.getX(), "Location", address, android.R.drawable.ic_menu_myplaces, null, false, 1);
}
The problem is, I want the markers to be clickable, but if I click them, another marker is added. I have tried to nullify the MapOnTouchListener, but that way, no marker is added, and no click on marker is detected...
How could I acomplish that?
Thank you.
EDIT:
if I simply set a SingleTapListener on the map at the start of the execution of the app instead of setting my MapOnTouchListener, the markers are created, and are clickable:
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
#Override
public void onSingleTap(float v, float v1) {
mMapView.createIcon(v,v1);
}
});
After that, by clicking a button, I set the MapOnTouchListener, because I need another functionality (create an envelope and store the points in that envelope inside an array). After doing that, I try to nullify the MapOnTouchListener, and after that set the singleTapListener as in the start of the execution...and the markers are created, but cannot be clicked!!

Google map geoJson layer feature info on click

smart people :)!
Story: I have many layers what I have added to google maps in android. I am adding them by iterating - creating new GeoJsonLayer and calling method addLayerToMap(). I have created setOnFeatureClickListener on last GeoJsonLayer (Maybe here is the problem).
Problem: When I click on feature (LineString, Polygon) I receive information only about last Layer - polygon. Then I added mMap.setOnPolylineClickListener(), then click listener is going into correct methods - for LineString in PolyLineClick... etc, but here again is problem - how can I get information from Polyline about LineString properties, what I added to geoJson?
Question: What is the best approach to add layers to map , so I can manage click events and show LineString or Polygon properties for user?
Code example:
geoJsonLayer.setOnFeatureClickListener(new GeoJsonLayer.GeoJsonOnFeatureClickListener() {
#Override
public void onFeatureClick(Feature feature) {
mMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
#Override
public void onPolylineClick(Polyline polyline) {
//TODO show LineString properties
//Comes here when LineString clicked
}
});
mMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
#Override
public void onPolygonClick(Polygon polygon) {
//TODO show Polygon properties
//Comes here when Polygon clicked
}
});
}
Found solution - added all layers into 1 layer and everything works fine.

info window not showing

This is really killing me, I had them working then rewrote a bunch of code, and now it doesn't and I've got no version control! Any help is appreciated.
I create the markers in a Utility class.
private static MarkerOptions buildAmarker(LatLng location, String bankType, String locationDetails,
float markerColour) {
MarkerOptions binMarker = new MarkerOptions().position(location).title(bankType)
.snippet(locationDetails)
.icon(BitmapDescriptorFactory.defaultMarker(markerColour));
//.snippet(siteName + " | " + locationDetails);
return binMarker;enter code here
Then after my Loader completes, onLoadFinish, it hands me back various list of marker Options objects, I process them into Markers here:
private List<Marker> addBankListToMap(List<MarkerOptions> oneBankList) {
Log.i("ADDING a selected", "banks list to map");
// we need to save NEW lists of map attached markers OR can't change marker visibility
List<Marker> newBankList = new ArrayList<>();
for (int i = 0; i < oneBankList.size(); i++) {
MarkerOptions binMarker = oneBankList.get(i);
Marker newMarker = m_map.addMarker(binMarker);
newMarker.setVisible(true);
newBankList.add(newMarker);
//Log.e("!!!addingBank", newMarker.getTitle() + newMarker.getSnippet());
}
return newBankList;
Then end onLoadFinish with this
// setup click event for home marker to launch change home screen
m_map.setOnMarkerClickListener(EarthquakeActivity.this);
But none of the info windows appear if clicked. What am I missing? It was working till I rewrote my code, and I made a LOT of algorthmic improvements, I use arrays instead of half a dozen hashmaps, so the memory overhead should be less.
I can only think I've either deleted something crucial in a tidy up while being tired.
OR
I've blocked the info windows somehow. Some sleuthing to find the block, by disabling the changes, has failed. So it seems I've deleted something, forgotten something vital.
What do I need to do to get infoWindows working again? This is absolutely vital to my app. Arrggg!
#Override
public boolean onMarkerClick(Marker marker) {
if (marker.equals(homeMarkerFinal)) {
// TODO make this launch the change home address screen
Log.wtf("markerClicked", "!!!!");
Intent settingsIntent = new Intent(EarthquakeActivity.this, SettingsActivity.class);
startActivity(settingsIntent);
}
return true;
}
This is just for a single marker, the home marker. All the other markers are unnamed, I've got around 4000 markers stored in Lists as MarkerOptions. These lists are passed to addBankListToMap as oneBankList and converted into Markers, and attached to the map.
To show inforwindow you need call:
marker.showInfoWindow();
Pls put in in your onMarkerClick function.
Brilliant phongvan!, of course at some point I deleted this
else {
marker.showInfoWindow();
}
onMarkerClick.
Thankgod! My app had become useless! :) A thousand thanks phongvan.

touch the screen and add a marker in android

I want add a marker when I touch the screen. I use osmdroid and no google map.
Moreover, I want get back coordinate of this marker.
for the moment, I can display the osm map and display the location of the user.
thanks !
You can use MapEventsReceiver.
First make sure you have
implementation 'org.osmdroid:osmdroid-mapsforge:6.1.6'
in your build gradle (or newer version).
Then you make you OSMDroid class implement it
public class OSMapClass implements MapEventsReceiver {
// Your map implementation here
#Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
// Here implement single click behaviour
return false;
}
#Override
public boolean longPressHelper(GeoPoint p) {
// Here implement long click behaviour
return false;
}
}

Categories

Resources