Добавление настраиваемого свойства в маркер (Google Maps Android API V2)

17

При использовании 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);

}
    
задан Arch1tect 08.06.2013 в 09:20
источник
  • попробуйте здесь stackoverflow.com/questions/14811579/... –  user2725663 28.08.2013 в 16:29

1 ответ

42

Вы не можете напрямую продлить 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 Google Android версии v2 на расширения Android-карт .

Это очень похоже на пункт 1, но вы можете напрямую сохранить MyData в маркер, используя

marker.setData(myDataObj);

и позже:

MyData myDataObj = (MyData) marker.getData();
    
ответ дан MaciejGórski 08.06.2013 в 15:39
источник
  • thx ~ В конце я выбрал первый метод, и он работает. Любая идея, почему v2 не позволяет расширять? просто любопытно.. –  Arch1tect 09.06.2013 в 01:47
  • @ Arch1tect Выбор дизайна, основанный на решении использовать отдельный процесс для выполнения реальной работы. Объекты, с которыми вы взаимодействуете, являются не чем иным, как прокси. –  MaciejGórski 09.06.2013 в 02:24
  • Проблема с allMarkersMap заключается в том, что она будет повторно инициализирована на пустую карту всякий раз, когда деятельность будет заново создана (рассмотрите, например, вращение отображения). Маркер класса не является сериализуемым, т. Е. Карта не может быть сохранена непосредственно в комплекте. –  Cimlman 10.03.2016 в 16:41
  • @Evilripper Мне также нравится третий вариант, но сейчас четвертый. Разработчики Google Maps API v2 недавно добавили маркер :: getTag и Marker :: setTag. Очень похоже на getData / setData в AME. –  MaciejGórski 23.01.2017 в 14:40
  • он работает! из версии com.google.android.gms: play-services: 9.4.0 Маркер-маркер = mMap.addmarker (новый MarkerOptions (...)); [...] public boolean onMarkerClick (Marker arg0) {arg0.getTag (); –  Evilripper 23.01.2017 в 16:23
Показать остальные комментарии