【问题标题】:Associate an object with Marker (google map v2)将对象与标记关联(谷歌地图 v2)
【发布时间】:2016-08-24 19:51:21
【问题描述】:

在我的应用程序中,我有一些使用标记在地图上显示其位置的对象。 问题是我发现处理标记点击的唯一方法是

googleMap.setOnMarkerClickListener(new ... {
    @Override
    public void onMarkerClick(Marker marker) {
       // how to get the object associated to marker???
    }
})

换句话说,我得到了 Marker 对象,而我拥有的唯一接口允许我只设置 MarkerOptions。

有什么方法可以将 Marker 与对象关联起来?

【问题讨论】:

    标签: android android-maps google-maps-android-api-2


    【解决方案1】:

    我认为虽然 Android 团队的这个回调不是很彻底,但是,它就是我们所拥有的。

    每当您调用mMap.addMarker(); 时,它都会返回生成的标记。然后,您可以使用 HashMap 或其他一些数据持有者结构来记住它。

    // Create the hash map on the beginning
    WeakHashMap <Marker, Object> haspMap = new WeakHashMap <Marker, Object>();
    
    
    // whenever adding your marker
    Marker m = mMap.addMarker(new MarkerOptions().position(lat, lng).title("Hello World").icon(icon_bmp));
    haspMap.put(m, your_data);
    

    【讨论】:

    • 我推荐WeakHashMap,所以当Marker 被垃圾回收时,其关联的WeakHashMap 条目和Object 值也会被回收。但是,是的,不幸的是,这似乎是目前唯一的选择。
    • 对我来说很有意义。我将答案编辑为 WeakHashMap。可以吗?
    • bzzzzt,错了!我必须使用 HashMap,否则映射会以某种方式被垃圾收集。
    • 文档说marker对象可能会改变,所以不要用marker作为key,使用m.getId()。
    • 嗨@dwery,我在文档中找不到。请给个链接好吗?
    【解决方案2】:

    您可以使用MarkersetTag()方法关联任意对象

    Marker amarker = mMap.addMarker(new MarkerOptions().position(lat, lng).title("Hello World"));
    amarker.setTag(new SomeData());
    

    要检索与标记关联的数据,您只需使用其getTag() 读取它,然后将其转换为其原始类型。

    SomeData adata = (SomeData) amarker.getTag();
    

    More information

    【讨论】:

    • 这是正确的解决方案。根据有关标记中标记的文档:“与标记关联的对象。例如,对象可以包含有关标记所代表内容的数据。这比存储单独的 Map 更容易。”
    • 从 Play Services 9.4 开始的正确解决方案
    • 这是正确的解决方案!
    • 4 年后他们实现了这个开箱即用的工具 =)
    【解决方案3】:

    另一种选择是创建一个 Map,其键是 marker.getId(),值是我们的对象。

    这样,我们就不会在内存中保留对标记的引用,也不必担心垃圾收集标记。

    在这里你可以看到more answers

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 2011-03-25
      • 2014-07-20
      • 1970-01-01
      • 2011-07-14
      • 2012-11-29
      • 2016-10-12
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多