Добавление настраиваемого свойства в маркер (Google Maps Android API V2)
При использовании 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);
}
Ответы
Ответ 1
Вы не можете напрямую расширять Marker
, потому что это последний класс, но у вас есть несколько вариантов:
0) С Google Maps Android API версии 9.4.0 вы можете использовать Marker::getTag
и Marker::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) Переключитесь с простого API Android Google Maps v2 на Расширения Android Maps.
Это очень похоже на пункт 1, но вы можете прямо хранить MyData
в маркере, используя
marker.setData(myDataObj);
и позже:
MyData myDataObj = (MyData) marker.getData();
Ответ 2
Я использовал Marker.setTag(Object o)
и .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()
И доступ к этому объекту. в InfoWindowAdapter легко:
@Override
public View getInfoContents(Marker marker) {
...
Object o = marker.getTag();