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

Maps API v2 с различными действиями маркера

Я пытаюсь перенести приложение на новый API Карт Google v2, но у меня возникают проблемы при взаимодействии с маркерами.

Мой контекст: у меня есть карта, показывающая остановки автобусов и автобусов. В старой библиотеке у меня был свой ItemizedOverlay для автобусных остановок и еще один для автобусов. У каждого из них был другой OnTapListener (на самом деле я использую внешнюю библиотеку для отображения воздушных шаров), поэтому, когда пользователь удаляет маркер шины, ничего не происходит, но когда он отбирает маркер остановки автобуса, открывается активность с его информацией. Кроме того, в моем ItemizedOverlay я сопоставил каждый маркер с его объектом остановки шины модели.

Теперь с новым API у меня есть две основные проблемы:

  • Вы устанавливаете слушателя с помощью методов setOnInfoWindowClickListener() или setOnMarkerClickListener() вашего объекта GoogleMap. Другими словами, вы можете установить только один прослушиватель для всех карт, поэтому я не могу различать краны на остановках или автобусах.
  • Метод onClick обоих маркеров получает только объект Marker, откуда я не могу получить слишком много информации, например, номер остановки шины, чтобы открыть его активность (и я надеюсь, что есть лучший способ, чем разбор заголовка String! O_O )

Я думаю, что эти две проблемы могут быть решены с использованием разных подклассов Marker, но у него нет конструктора, и вы получаете его ссылку при добавлении его на карту, поэтому я не знаю, можно ли использовать пользовательскую реализацию.

API является новым, поэтому в Интернете мало информации о подобных проблемах. Я пытался выяснить, как это решить, но я ничего не получил. Кто-нибудь знает о возможном решении этого?

Спасибо.

EDIT: Снимок экрана из моей текущей карты приложений с двумя типами маркеров: A screenshot from my current application's map with two types of marker

4b9b3361

Ответ 1

Я столкнулся с этой проблемой. Мое решение было:

private Map<Marker, MyModel> markerMap = new HashMap<>();
private GoogleMap mMap;

private void doMarkers(){
    MarkerOptions opt = new MarkerOptions();
    //Fill out opt from MyModel
    Marker marker = mMap.addMarker(opt);
    markerMap.put(marker, myModel);
}

а затем в обратном вызове OnMarkerClickListener вытащите свою модель из HashMap с помощью щелчка. Существует также метод Marker.getId(), который по какой-то причине возвращает строку. Я не понимаю, почему вы не можете указать идентификатор int при создании маркера или почему вы не можете получить доступ к объекту маркера, прежде чем добавлять его на карту.

ОБНОВЛЕНИЕ: спустя почти 4 года Google добавил метод Marker.setTag(Object tag), чтобы связать произвольные данные с маркером.

Ответ 2

Хорошо, вот решение, которое я решил использовать, и AFAIK должен работать в любой ситуации:

private HashMap<String, MyModel> markers= new HashMap<String, MyModel>();


MyModel item = ...
MarkerOptions markerOptions = ...
markers.put(mMap.addMarker(markerOptions).getId(), item);



@Override
public void onInfoWindowClick(Marker marker) {
   MyModel mapItem = (MyModel) markers.get(marker.getId());.
   ...
}

Ответ 3

Вы можете использовать метод маркера getId

Ответ 4

Вы можете использовать HashMarker. В этом примере y точек заряда в Arraylist и каждая точка cointaints новый ArrayList с координатами. И идея заключается в том, что вы получаете идентификатор точки.

Создайте HashMap

Маркеры = новый HashMap();

Затем вы создаете маркер и добавляете к карте

final Маркер-маркер = map.addMarker(новая позиция MarkerOptions(). (новый LatLng (координаты .get(j).getLat(), codes.get(j).getLon())). title (point.getName()));

Затем вы можете сохранить идентификатор точки со значением маркера

Markers.put(маркер, point.getId());

И наконец вы можете получить значение id, когда вы нажимаете InfoWindow

public void onInfoWindowClick (маркерный маркер) {

    final long id = Marcadores.get(marker);
    Log.e("Real Marker ID", id+"");
}

ИЛИ

При нажатии маркера

public boolean onMarkerClick (Marker arg0) {

    final long id = Marcadores.get(marker);
    Log.e("Real Marker ID", id+"");
    return false;
}