Intereting Posts
Показать диалог из фрагмента? Как удалить контакт программно в android Как передать два разных типа данных в AsyncTask, Android Я хочу, чтобы текстовое представление было кликабельным. Установить видимость индикатора выполнения после завершения загрузки изображения с использованием библиотеки Glide Многоцветный Android в одном TextView Плагины не всегда добавляются после того, как кордова добавляет платформу android и iOs Возможно ли иметь «дополнительные» разрешения в Android? Разница между add (), replace () и addToBackStack () Значки «Назад» и «Переполнение» Неправильный цвет в предустановленных устройствах после обновления до библиотеки поддержки 23.2.0 Изменение на основе темы Пример Google Play Services: «connectionResult не может быть разрешен» Повторная настройка RecyclerView StaggeredGridLayoutManager Как сохранить положительные / отрицательные кнопки DialogFragment над мягкой клавиатурой Загрузить локальный html в WebView?

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

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

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

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

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

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

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

Благодарю.

EDIT: скриншот из карты моего текущего приложения с двумя типами маркеров: Снимок экрана с карты моего текущего приложения с двумя маркерами

Solutions Collecting From Web of "Maps API v2 с различными действиями маркера"

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

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) для связывания произвольных данных с маркером.

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

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

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

Создание HashMap

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

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

Конечный маркер маркера = map.addMarker (новая позиция MarkerOptions (). (Новый LatLng (codes.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; }