18

使用 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);

}
4

2 回答 2

46

您不能直接扩展Marker,因为它是最终类,但您有一些选择:

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将所有信息存储为 aString并稍后解析它,但这是一种丑陋且不可维护的解决方案。

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

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

marker.setData(myDataObj);

然后:

MyData myDataObj = (MyData) marker.getData();
于 2013-06-08T13:39:28.287 回答
2

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

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();
于 2019-06-10T10:35:36.810 回答