从GoogleMap中删除标记

Jon*_*nas 109 android google-maps

在适用于Android的新Google Maps API中,我们可以添加标记,但无法(轻松)删除标记.

我的解决方案是将标记保留在地图中并在我想删除标记时重绘地图,但效率不高.

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);
      }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

有没有人有更好的主意?

Ant*_*ony 238

方法签名addMarker是:

public final Marker addMarker (MarkerOptions options)
Run Code Online (Sandbox Code Playgroud)

因此,当您GoogleMap通过指定标记的选项向a添加标记时,应该保存Marker返回的MarkerOptions对象(而不是用于创建它的对象).此对象允许您稍后更改标记状态.完成标记后,您可以调用Marker.remove()将其从地图中删除.

另外,如果您只想暂时隐藏它,可以通过调用来切换标记的可见性Marker.setVisible(boolean).


小智 25

清除地图中的所有涂鸦使用

map.clear()
Run Code Online (Sandbox Code Playgroud)

  • 这会清除地图上的所有叠加层,而不仅仅是问题所暗示的标记. (13认同)

小智 25

像这样将标记添加到地图中

Marker markerName = map.addMarker(new MarkerOptions().position(latLng).title("Title"));
Run Code Online (Sandbox Code Playgroud)

然后你就可以使用remove方法了,它只会删除那个标记

markerName.remove();
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您使用 Kotlin 语言,则只需添加以下代码:

创建GoogleMapMarker类型的全局变量。

我使用变量标记使变量标记值可以直接更改

private lateinit var map: GoogleMap
private lateinit var marker: Marker
Run Code Online (Sandbox Code Playgroud)

我使用这个函数/方法在我的地图上添加标记:

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

创建函数后,我将此代码放在onMapReady()删除标记并创建一个新标记上:

map.setOnMapClickListener { location ->
        map.clear()
        marker.remove()
        placeMarkerOnMap(location)
    }
Run Code Online (Sandbox Code Playgroud)

如果您想在单击标记时显示地址位置,请添加此代码以隐藏和显示标记地址,但您需要一种方法来获取地址位置,这是额外的好处。我从这篇文章中获得了代码:如何从纬度和经度获取完整的地址?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

如果存在标记,则删除最后一个标记。如果标记不存在创建当前标记

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)));
}
Run Code Online (Sandbox Code Playgroud)