Intereting Posts
Android: Невозможно получить данные изображения RAW с камеры? Android-браузер делает границы неправильными, если радиус границы меньше общей ширины границы Android GridLayoutManager с диапазоном столбцов и строк Android NDK: нет правила, чтобы сделать цель Не удалось отладить библиотечные проекты с помощью ADT v14 – Источник не найден Как использовать фрагмент диалога? (ShowDialog устарел) Android Отключение автовстречи в WebView? Java.lang.OutOfMemoryError для хранения изображений в sqlite db Как передать данные из фрагмента в диалогFragment EditText задает начало текста 10dp с левой границы Как поместить изображение в ImageView с помощью Glide Как определить номер канала wifi, используемый wifi ap / network? Firebase Android: событие onDataChange () всегда выполняется в главном потоке пользовательского интерфейса? Как я могу запустить экран настроек мобильной сети из своего кода Живой фон Эффект пульсации воды

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; }