Подтвердить что ты не робот

Добавление настраиваемого свойства в маркер (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);

}
4b9b3361

Ответ 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();