Видаліть маркер із GoogleMap


124

У новому API Карт Google для Android ми можемо додати маркер , але немає способу (легко) його видалити.

Моє рішення - тримати маркери на карті та перемальовувати карту, коли я хочу видалити маркер, але це не дуже ефективно.

private final Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();

private void add(String name, LatLng ll) {
  final MarkerOptions marker = new MarkerOptions().position(ll).title(name);
  mMarkers.put(name, marker);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.addMarker(marker);
    }
  });
}

private void remove(String name) {
  mMarkers.remove(name);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.clear();

      for (MarkerOptions item : mMarkers.values()) {
        mMap.addMarker(item);
      }
    }
  });
}

Хтось має кращу ідею?


Чому ви використовуєте Runnable () для додавання маркерів?
— користувач3927312

Щоб зробити це на потоці інтерфейсу користувача
— Jonas

використовувати mMap.clear (), щоб очистити всі маркери
— Bahaa Salaheldin

Відповіді:


260

Підпис методу для addMarker:

public final Marker addMarker (MarkerOptions options)

Отже, додаючи маркер до а GoogleMap, задаючи параметри маркера, слід зберегти Markerповернутий об’єкт (замість MarkerOptionsоб'єкта, який ви створили). Цей об’єкт дозволяє згодом змінити стан маркера. Коли ви закінчите з маркером, ви можете зателефонувати, Marker.remove()щоб видалити його з карти.

На відміну, якщо ви хочете лише приховати його тимчасово, ви можете переключити видимість маркера, зателефонувавши Marker.setVisible(boolean).


1
Це не працює для мене. marker.setVisible (false), marker.remove (), навіть markerManager.remove (marker) не впливає на карту. Маркери все ще залишаються. якісь підказки?
— Тоталіс

1
Дивіться мій коментар нижче про тримання маркера, але він не має користі після його видалення з карти, якщо ви вирішите вивчити його значення. Метод Remove встановить значення тегу на нуль ...
— Speckpgh

Розумний! Дякую!
— Таслім Осені

32

Додайте маркер до такої карти

Marker markerName = map.addMarker(new MarkerOptions().position(latLng).title("Title"));

Тоді ви зможете скористатися методом видалення, він видалить лише той маркер

markerName.remove();

25

щоб очистити всі писанки у використанні карти

map.clear()

14
Це знімає всі накладки на карті, а не лише маркер, як підказує питання.
— Емзор

4

якщо маркер існує, видаліть останній маркер. якщо маркер не існує, створіть поточний маркер

Marker currentMarker = null;
if (currentMarker!=null) {
    currentMarker.remove();
    currentMarker=null;
}

if (currentMarker==null) {
    currentMarker = mMap.addMarker(new MarkerOptions().position(arg0).
    icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}

3

Якщо ви використовуєте мову Kotlin, ви просто додасте цей код:

Створення глобальних змінних GoogleMapта Markerтипів.

Я використовую мінливий маркер, щоб зробити змінне значення маркера може змінюватися безпосередньо

private lateinit var map: GoogleMap
private lateinit var marker: Marker

І я використовую цю функцію / метод, щоб додати маркер на свою карту:

private fun placeMarkerOnMap(location: LatLng) {
    val markerOptions = MarkerOptions().position(location)
    val titleStr = getAddress(location)
    markerOptions.title(titleStr)
    marker = map.addMarker(markerOptions)
}

Після створення функції я розміщую цей код на, onMapReady()щоб видалити маркер і створити новий:

map.setOnMapClickListener { location ->
        map.clear()
        marker.remove()
        placeMarkerOnMap(location)
    }

Це бонус, якщо ви хочете відобразити адресу адреси, коли натискаєте маркер, додайте цей код, щоб приховати та показати адресу маркера, але вам потрібен метод отримання адреси адреси. Я отримав код з цієї публікації: Як отримати повну адресу від широти та довготи?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }

2

використовувати наступний код:

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

           marker.remove();
           return true;
       }
   });

Після натискання на "маркер" ви можете його видалити.


2

Просто ПРИМІТКА, те, що я витрачав години, відстежуючи сьогоднішній день ...

Якщо ви вирішили затримати маркер з якоїсь причини, після того як ви його видалили з карти ... getTag поверне NULL, хоча решта значень отримання повернуться зі значеннями, які ви встановили їм під час створення маркера. .

Значення TAG встановлюється на NULL, якщо ви коли-небудь видалите маркер, а потім спробуйте посилатися на нього.

Мені здається помилка ...


1

1. Якщо ви хочете видалити маркер, ви можете зробити це як marker.remove(); альтернативу, ви також можете приховати маркер, а не видаляти його як

 marker.setVisible(false);

і зробити це видно пізніше, коли це буде потрібно.
2. Однак якщо ви хочете видалити всі маркери з карти, використовуйте map.clear();
Примітка: map.clear(); також видаліть Polylines, Circlesі т. Д.
3. Якщо ви не хочете видаляти Polylines, Circlesі т. Д., То використовуйте петлю довжиною маркера (якщо у вас є кілька маркерів), щоб видалити ці Ознайомтеся з прикладом тут АБО встановіть їх Visible false І не використовуйте map.clear();в такому випадку.


1

Зробіть глобальну змінну для відстеження маркера

private Marker currentLocationMarker;

// Видаліть старий маркер

            if (null != currentLocationMarker) {
                currentLocationMarker.remove();
            }

// Додайте оновлений маркер і перемістіть камеру

            currentLocationMarker = mMap.addMarker(new MarkerOptions().position(
                    new LatLng(getLatitude(), getLongitude()))
                    .title("You are now Here").visible(true)
                    .icon(Utils.getMarkerBitmapFromView(getActivity(), R.drawable.auto_front))
                    .snippet("Updated Location"));

            currentLocationMarker.showInfoWindow();

0

Створіть масив із усіма маркерами, доданими на карті.

Пізніше використовуйте:

Marker temp = markers.get(markers.size() - 1);
temp.remove();

0

Для тих, хто наслідує приклад цього проекту GoogleMaps - MapWithMarker , ви можете видалити маркер, зробивши це

override fun onMapReady(googleMap: GoogleMap?) {
    googleMap?.apply {

        // Remove marker
        clear()

        val sydney = LatLng(-33.852, 151.211)
        addMarker(
            MarkerOptions()
                .position(sydney)
                .title("Marker in Sydney")
        )
        moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.