Java 单击“信息侦听器”窗口Google Maps V2

Java 单击“信息侦听器”窗口Google Maps V2,java,android,google-maps,google-maps-markers,Java,Android,Google Maps,Google Maps Markers,我有一个简单的“地点”课程: 我在这样的数组列表中添加了“Places:(注意名称是非唯一的) 我想知道如何为要添加到地图的每个标记添加侦听器。我试着用 map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { } }); 但是,我能做的唯一一件事就

我有一个简单的“地点”课程:

我在这样的数组列表中添加了“Places:(注意名称是唯一的)

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

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

        }
    });

但是,我能做的唯一一件事就是获取标记的标题,它不是唯一的,因此我无法真正找到正在单击的确切“位置”对象。有什么想法吗?谢谢

以这种方式编辑您的循环

for(Place place : places) {
    Marker marker = map.addMarker(new MarkerOptions().position(place.latlng).title(place.name);
    place.markerId = marker.getId();
}
当然,您需要将变量markerid添加到
place

getId()


然后在信息窗口ClickListener中,您可以通过markerId找到位置。

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

地点1:name=“test”,address=“test2”,id=0
地点2: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中,我只是通过

  String  id=marker.getTitle().substring(0,1);//if your places are < 10
String id=marker.getTitle().substring(0,1)//如果你的位置<10
第二条路 正在刷新您的自定义信息窗口 并创建对象“位置”

我建议使用
HashMap

private HashMap<Marker, Place> markerMap = new HashMap<Marker, Place>();
在你的听众中:

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

您可以使用调用
标记
上的
getPosition()
返回的
LatLng
对象来唯一标识每个
标记
,并在
位置
数组中查找匹配项

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

            }
        }
    });
文件:


我有一个方法来获取标记的索引,您可以使用它来获取位置中的元素

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()方法:


看来这是我最好的选择。将在我测试它时更新。谢谢这不是最好的。HashMap占用内存,速度有点慢。@在这种情况下,我认为它比每次用户单击标记时循环所有位置更为理想。@user1282637当然,没问题!您还可以向每个
标记添加一个唯一的
代码段
,并使用它。没错,我可以将Place.id放入代码段中…感谢您的帮助我使用了您的LatLng解决方案。这是最简单的实现。这显然不适用于两个地址相同的地方(即购物中心的商店),但我的应用程序没有这个问题。谢谢你的帮助
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
        }
    });
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....
               }

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