单击监听器获取信息 Window Google Maps V2

Click Listener for Info Window Google Maps V2

我有一个简单的 "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;
    }
}

并且我将 "Places" 添加到 ArrayList,如下所示:(注意 名称 不是 唯一)

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));

我正在向我的 Google 地图添加标记,如下所示:

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

我想知道如何为添加到地图中的每个标记添加侦听器。我试过使用

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

        }
    });

这是有效的,但是,我唯一能做的就是获取标记的标题,它不是唯一的,所以我无法真正找到确切的 "Place" object点击。有任何想法吗?谢谢

以这种方式编辑循环

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

当然你需要添加变量markerid到place

getId();

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

然后在onInfoWindowClickListener你可以通过markerId找到地方。

我使用一个对象的键来找到它 例如我有两个地方:

place1 : name= "test" , address ="test2" , id= 0
place2 : name= "test" , address ="test2" , id= 1

在标记中,如果我使用这个,它们看起来是一样的:

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

所以为了区分它们,我将代码修改为:

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

在 infoWindowClickListener 中,我只是通过

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

第二种方式

正在破坏您的自定义信息窗口 并创建你的对象 "place" http://androidfreakers.blogspot.com/2013/08/display-custom-info-window-with.html

我建议使用 HashMap

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

在你的循环中:

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

在你的听众中:

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

您可以只使用在 Marker 上调用 getPosition() 返回的 LatLng 对象来唯一标识每个 Marker,并在您的 [=15] 中找到匹配项=]数组。

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....
               }

            }
        }
    });

文档:

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

我有一个获取标记索引的方法,您可以使用它来获取 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() 方法:

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;
}