138 votes

Supprimer un marqueur d'une carte GoogleMap

Dans la nouvelle API Google Maps pour Android, nous pouvons ajouter un marqueur mais il n'y a aucun moyen de l'enlever (facilement).

Ma solution consiste à conserver les marqueurs dans une carte et à redessiner la carte lorsque je veux supprimer un marqueur, mais ce n'est pas très efficace.

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

Quelqu'un a-t-il une meilleure idée ?

275voto

Anthony Points 996

La signature de la méthode pour addMarker est :

public final Marker addMarker (MarkerOptions options)

Ainsi, lorsque vous ajoutez un marqueur à un GoogleMap en spécifiant les options pour le marqueur, vous devez sauvegarder le fichier Marker qui est renvoyé (au lieu de l'objet MarkerOptions que vous avez utilisé pour le créer). Cet objet vous permet de modifier ultérieurement l'état du marqueur. Lorsque vous avez terminé avec le marqueur, vous pouvez appeler Marker.remove() pour le supprimer de la carte.

Par ailleurs, si vous ne souhaitez le masquer que temporairement, vous pouvez modifier la visibilité du marqueur en appelant Marker.setVisible(boolean) .

40voto

Eclipse22 Points 183

Ajoutez le marqueur à la carte comme suit

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

Ensuite, vous pourrez utiliser la méthode de suppression, qui ne supprimera que ce marqueur.

markerName.remove();

29voto

Pour effacer tous les gribouillages dans la carte, utilisez

map.clear()

6voto

dor sharoni Points 61

Si le marqueur existe, supprimez le dernier marqueur. Si le marqueur n'existe pas, créez le marqueur actuel.

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

6voto

Si vous utilisez le langage Kotlin, il suffit d'ajouter ce code :

Créer des variables globales de GoogleMap y Marker types.

J'utilise un marqueur variable pour que la valeur du marqueur variable puisse changer directement.

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

Et j'utilise cette fonction/méthode pour ajouter le marqueur sur ma carte :

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

Après avoir créé la fonction, je place ce code sur la page d'accueil. onMapReady() pour supprimer le marqueur et en créer un nouveau :

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

C'est un bonus si vous voulez afficher l'emplacement de l'adresse lorsque vous cliquez sur le marqueur ; ajoutez ce code pour cacher et afficher l'adresse du marqueur mais vous avez besoin d'une méthode pour obtenir l'emplacement de l'adresse. J'ai obtenu le code à partir de ce post : Comment obtenir une adresse complète à partir de la latitude et de la longitude ?

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X