将自定义属性添加到标记(Google Map Android API V2)

Arc*_*ect 17 android google-maps google-maps-android-api-2

使用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,
  ...
Run Code Online (Sandbox Code Playgroud)

});

我想知道我是否可以为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);

}
Run Code Online (Sandbox Code Playgroud)

Mac*_*ski 43

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

0)自谷歌地图Android API v2版本9.4.0起,您可以使用Marker::getTagMarker::setTag.这很可能是首选方案.

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

private Map<Marker, MyData> allMarkersMap = new HashMap<Marker, MyData>();
Run Code Online (Sandbox Code Playgroud)

创建标记时,请使用您的数据将其添加到此地图中:

Marker marker = map.addMarker(...);
allMarkersMap.put(marker, myDataObj);
Run Code Online (Sandbox Code Playgroud)

稍后在你的render函数中:

MyData myDataObj = allMarkersMap.get(marker);
if (myDataObj.customProp) { ...
Run Code Online (Sandbox Code Playgroud)

2)另一种方法是使用Marker.snippet将所有信息存储为a String并稍后解析它,但这是一种丑陋且难以维护的解决方案.

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

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

marker.setData(myDataObj);
Run Code Online (Sandbox Code Playgroud)

然后:

MyData myDataObj = (MyData) marker.getData();
Run Code Online (Sandbox Code Playgroud)