Как управлять нажатием на маркер, которого нет в Cluster в Android Google Map API? - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблемы с реализацией OnClickListener для маркеров, которые не находятся в кластере, то есть не добавляются с помощью:

 mClusterManager.addItem(markerCluster);

Я установил OnMarkerClickLister следующим образом:

 mMap.setOnCameraIdleListener(mClusterManager);
 mMap.setOnMarkerClickListener(mClusterManager);

Если я просто использую:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            return false;
        }
    });

клик по маркерам вообще не работает.

Например: у меня такая ситуация:

enter image description here

Две зеленые точки и большая синяя точка (с номером 6) - это один кластер, но красный маркер отсутствует в кластере, так как я не хочу, чтобы он был кластеризованным, как другие маркеры. InfoWindow обычно отображается, когда я нажимаю на красный маркер, но onMarkerClick не работает - так же, как и OnClusterItemClickListener. Но OnClusterItemClickListener работает, когда я нажимаю на маркеры, которые находятся в Cluster.

Надеюсь, вы понимаете, чего я пытаюсь достичь. Если нет, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Если вы хотите, чтобы работали прослушиватели Marker и Cluster, вы можете написать

mGoogleMap.getMarkerManager().onMarkerClick(marker);

внутри вашего OnMarkerClickListener

0 голосов
/ 06 сентября 2018

Обновленный ответ

Изображение, которое вы добавили в свое редактирование, ясно объясняет проблему, спасибо за это!

Чтобы тоже решить эту проблему, нам нужно зарегистрировать слушателя иначе. А именно: путем регистрации его в MarkerManager ClusterManager, поскольку этот класс теперь обрабатывает все маркеры. Нам также нужно добавить NormalMarkers немного по-другому, поэтому давайте пройдемся по нему шаг за шагом:

1) Обновление OnMarkerClickListener из mMap:

mMap.setOnMarkerClickListener(mClusterManager.getMarkerManager()); // Note the `MarkerManager` here

2) Этот MarkerManager содержит все коллекции. Нам нужно создать новую коллекцию для этого менеджера, в которую мы добавим маркеры NormalMarkers, которые должны отображаться отдельно от кластеров:

MarkerManager.Collection normalMarkersCollection = mClusterManager.getMarkerManager().newCollection();

3) Добавление маркеров выполняется аналогично тому, как это было раньше, но с использованием метода addMarker() в коллекции, которую мы создали. Мы должны передать объект MarkerOptions() этому:

// Create a normal marker
val markerOptions = MarkerOptions()
    .position(new LatLng(...))
    .title("My marker")
    .snippet("With description")

// Add it to the collection
normalMarkersCollection.addMarker(markerOptions)

4) И последнее, но не менее важное: мы хотим, чтобы на нем было OnClickListener:

normalMarkersCollection.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener {
    public boolean onMarkerClick(marker: Marker) {
        // NORMAL MARKER CLICKED!
        return false;
    }
})

5) Готово! Теперь нормальные маркеры добавляются на карту, как и раньше, но с рабочим OnMarkerClickListener.


Предыдущий ответ

(Настройка прослушивателей щелчков для кластеров и кластеризованных элементов)

Вы должны добавить список прослушивания к mClusterManager. Настройка списка кликов на mMap не работает при использовании ClusterManager.

Таким образом, вместо использования mMap.setOnMarkerClickListener, установите ClusterItemClickListener в диспетчере кластеров:

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
    @Override
    public boolean onClusterItemClick(MyItem item) {
        Log.d("cluster item","clicked");
        return true;
    }
});

Кроме того, если вы хотите захватить щелчок элемента кластеризованного элемента, используйте ClusterClickListener:

mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
    @Override
    public boolean onClusterClick(Cluster<MyItem> cluster) {
        Log.d("cluster","clicked");
        return true;
    }
});
...