将对象与Marker关联(google map v2)

les*_*hka 31 android android-maps google-maps-android-api-2

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

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

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

有什么方法可以将Marker与一个对象相关联?

Bud*_*ius 54

我认为这个回调并不是非常彻底的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);
Run Code Online (Sandbox Code Playgroud)

  • 文档说标记对象可能会更改,因此不要使用标记作为键,请使用m.getId(). (11认同)
  • 我推荐`WeakHashMap`,所以当`Marker`被垃圾收集时,它的关联`WeakHashMap`条目和'Object`值也是如此.但是,不幸的是,这似乎是目前唯一的选择. (8认同)
  • bzzzzt,错了!我不得不使用HashMap,否则映射会以某种方式收集垃圾. (5认同)

Zam*_*ara 31

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

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

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

SomeData adata = (SomeData) amarker.getTag();
Run Code Online (Sandbox Code Playgroud)

更多信息


San*_*ete 8

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

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

在这里你可以看到更多答案.