【问题标题】:Click Listener for Info Window Google Maps V2单击信息窗口的侦听器 Google Maps V2
【发布时间】:2015-07-10 16:23:09
【问题描述】:

我有一个简单的“Place”类:

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

我正在向 ArrayList 添加“Places”,如下所示:(注意名称不是唯一的)

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

        }
    });

这是可行的,但是,我唯一能做的就是获取标记的标题,它不是唯一的,所以我无法真正找到正在单击的确切“位置”对象。有任何想法吗?谢谢

【问题讨论】:

    标签: java android google-maps google-maps-markers


    【解决方案1】:

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

    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

    【讨论】:

    • @user1282637 当然,没问题!您还可以为每个 Marker 添加一个唯一的 snippet,然后使用它。
    • 是的,我可以将 Place.id 放入 sn-p...谢谢您的帮助
    • 我使用了您的 LatLng 解决方案。这是最简单的实现。这显然不适用于具有相同地址的两个地方(即购物中心的商店),但我的应用程序没有这个问题。感谢您的帮助
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      第二种方式

      正在占用您的自定义信息窗口 并创建你的对象“地方” http://androidfreakers.blogspot.com/2013/08/display-custom-info-window-with.html

      【讨论】:

        【解决方案4】:

        以这种方式编辑你的循环

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

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

        getId();

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

        然后在onInfoWindowClickListener你可以通过markerId找到位置。

        【讨论】:

        • Sweeeet 这看起来是我最好的选择。当我测试它时会更新。谢谢
        【解决方案5】:

        我建议使用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
                }
            });
        

        【讨论】:

        • 这不是最优的。 HashMap 占用内存,速度有点慢。
        • @RediOne1 在这种情况下,我认为它比每次使用单击标记时循环所有位置更优化。
        猜你喜欢
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 2019-08-04
        相关资源
        最近更新 更多