【问题标题】:Adding custom property to marker (Google Map Android API V2)向标记添加自定义属性(Google Map Android API V2)
【发布时间】:2013-06-04 12:42:51
【问题描述】:

使用 Google Map API V3 时,我可以通过以下方式添加自定义属性:

var marker = new google.maps.Marker({
  position: userLocation,
  map: myGoogleMap,
  animation: google.maps.Animation.DROP,
  icon: avatar,
  title: userName,
  customProperty1: bla,
  customProperty2: bla,
  customProperty3: bla,
  ...

});

我想知道我是否可以为 API V2 Android 做同样的事情,我想这样做的原因是每个标记的每个信息窗口都需要知道该标记的一些信息。我正在尝试在下面的render 函数中实现这一点:

private void render(Marker marker, View view) {
        int badge = R.drawable.android_face;

        if (marker.customProperty)
        //here I need to know this property to decide which image to use        
                         badge = R.drawable.bla;

        ((ImageView) view.findViewById(R.id.badge))
                    .setImageResource(badge);

}

【问题讨论】:

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


【解决方案1】:

你不能直接扩展Marker,因为它是一个final类,但是你有一些选择:

0) 从 Google Maps Android API v2 版本 9.4.0 开始,您可以使用 Marker::getTagMarker::setTag。这很可能是首选。

1) 创建一个地图来存储所有附加信息:

private Map<Marker, MyData> allMarkersMap = new HashMap<Marker, MyData>();

创建标记时,将其与您的数据一起添加到此地图中:

Marker marker = map.addMarker(...);
allMarkersMap.put(marker, myDataObj);

稍后在您的render 函数中:

MyData myDataObj = allMarkersMap.get(marker);
if (myDataObj.customProp) { ...

2) 另一种方法是使用Marker.snippet 将所有信息存储为String,然后再对其进行解析,但这有点丑陋且无法维护。

3) 从普通的 Google Maps Android API v2 切换到 Android Maps Extensions

这与第 1 点非常相似,但您可以直接将MyData 存储到标记中,使用

marker.setData(myDataObj);

及以后:

MyData myDataObj = (MyData) marker.getData();

【讨论】:

  • thx~ 我最终选择了第一种方法,它有效。知道为什么 v2 不允许扩展吗?只是好奇..
  • @Arch1tect 设计选择基于使用单独流程进行实际工作的决定。您与之交互的对象只不过是代理。
  • allMarkersMap 的问题在于,每当重新创建活动时(考虑例如显示旋转),它将重新初始化为空地图。 Marker 类不可序列化,即地图不能直接存储到包中。
  • @Evilripper 我也喜欢第三个选项,但现在有第四个。 Google Maps API v2 开发者最近添加了Marker::getTagMarker::setTag。非常类似于 AME 中的 getData / setData
  • 它有效!从版本 com.google.android.gms:play-services:9.4.0 Marker marker=mMap.addmarker(new MarkerOptions(...)); [...] public boolean onMarkerClick(Marker arg0) { arg0.getTag();
【解决方案2】:

我使用Marker.setTag(Object o).getTag() 来传递我的自定义位置obj。到标记。当然 Object 可以是任何你想要的对象。

Marker m = googleMap.addMarker(new MarkerOptions()
                .position( ... )
                // setTag is not part of MarkerOptions so can't be defined here
              );
m.setTag(location); // Marker.setTag()

然后访问那个 obj。在 InfoWindowAdapter 中很简单:

@Override
public View getInfoContents(Marker marker) {
   ...
   Object o = marker.getTag();

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    相关资源
    最近更新 更多