Home » Android » java – Click Listener for Info Window Google Maps V2

java – Click Listener for Info Window Google Maps V2

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have a simple “Place” class:

public class Plac{
    String name;
    int id;
    LatLng latlng;

    public Product(String name, int id, LatLng latlng) {
        this.name = name;
        this.id= id;
        this.latlng = latlng;
    }
}

and I’m adding “Places” to an ArrayList like this: (Note the names are not unique)

ArrayList<Place> places = new ArrayList<Place>();
places.add(new Place("McDonald's", 1));
places.add(new Place("McDonald's", 2));
places.add(new Place("McDonald's", 3));

I’m adding markers to my Google Map like this:

for(Place place : places)
map.addMarker(new MarkerOptions().position(place.latlng).title(place.name);

I want to know how to add a listener for each marker that is being added to the map. I’ve tried to use

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {

        }
    });

which works, however, the only thing I can do with this is get the title of the marker which is not unique so I can’t really find which EXACT “Place” object is being clicked on. Any ideas? Thanks

How to&Answers:

You could just use the LatLng object returned from calling getPosition() on the Marker to uniquely identify each Marker, and find the match in your places array.

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {

            LatLng latLon = marker.getPosition();

            //Cycle through places array
            for(Place place : places){
               if (latLon.equals(place.latlng)){
                    //match found!  Do something....
               }

            }
        }
    });

Documentation:

https://developer.android.com/reference/com/google/android/gms/maps/model/Marker.html

http://developer.android.com/reference/com/google/android/gms/maps/model/MarkerOptions.html

Answer:

I have a method to get the index of the marker and you can use it to get the element in Places.

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            Log.i("MAP", "the index of this element is: " + String.valueOf(getMarkerIndex(marker.getId())));
        }
    });

getMarkerIndex() method:

private int getMarkerIndex(String index){
    int myIndex = -1;
    try{
        myIndex = Integer.parseInt(index.replace("m", ""));
    }catch(NumberFormatException nfe){
        Log.e(TAG, nfe.getMessage());
    }
    return myIndex;
}

Answer:

i use the key of an object to find it
for example i have two places:

place1 : name= “test” , address =”test2″ , id= 0
place2 : name= “test” , address =”test2″ , id= 1

in the marker they appear the same if i use this :

 map.addMarker(new MarkerOptions().position(latlng)
                            .title(name).snippet(address);

so to distinguish between them i modified the code to be :

  map.addMarker(new MarkerOptions().position(latlng)
                            .title(id+"-"name).snippet(address);

and in the infoWindowClickListener i just access the id by

  String  id=marker.getTitle().substring(0,1);//if your places are < 10

2nd way

is ceating your custom infoWindow
and create your object “place”
http://androidfreakers.blogspot.com/2013/08/display-custom-info-window-with.html

Answer:

edit your loop this way

for(Place place : places) {
    Marker marker = map.addMarker(new MarkerOptions().position(place.latlng).title(place.name);
    place.markerId = marker.getId();
}

Of course you need add variable markerid to place

getId();

Gets this marker's id. The id will be unique amongst all Markers on a map.

then in onInfoWindowClickListener you can find place by markerId.

Answer:

I suggest using a HashMap.

private HashMap<Marker, Place> markerMap = new HashMap<Marker, Place>();

In your loop:

for(Place place : places){
   MarkerOption marker =new MarkerOptions().position(place.latlng).title(place.name);
   map.addMarker(marker);
   markerMap.put(marker, place)
}

In your Listener:

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
           Place place = markerMap.get(marker);// here you get your exact Place Object
        }
    });