it-roy-ru.com

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

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

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

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

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

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

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

Благодарю.

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

20
Sloy

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

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 id при создании маркера, или почему вы не можете получить доступ к объекту маркера, прежде чем добавить его на карту.

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

23
rockgecko

Хорошо, вот решение, которое я решил использовать, и 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());.
   ...
}
18
martinpelant

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

2
ignacio_gs

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

Создать HashMap

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

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

final Marker marker = map.addMarker (new MarkerOptions (). position (новый LatLng (координаты .get (j) .getLat (), координаты .get (j) .getLon ())). title (point.getName ()) );

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

Markers.put (marker, point.getId ());

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

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

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

OR

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

public boolean onMarkerClick (Marker arg0) {

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