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