2012-12-03 824 views
63

在新版Google Maps API for Android中,我们可以add a marker,但是没有办法(很容易)删除它。从谷歌地图中删除一个标记

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

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

有没有人有更好的主意?

+0

为什么使用Runnable()添加标记? – user3927312

+0

在UI线程上做到这一点 – Jonas

回答

163

addMarker方法签名为:

public final Marker addMarker (MarkerOptions options) 

所以,当你通过指定标记的选项添加标记到GoogleMap,您应该保存返回的Marker对象(而不是MarkerOptions对象你曾经创造它)。该对象允许您稍后更改标记状态。完成标记后,您可以拨打Marker.remove()将其从地图中移除。另外,如果您只想暂时隐藏它,则可以通过调用Marker.setVisible(boolean)来切换标记的可见性。

+1

该死的我错过了。谢谢 ! – Jonas

+0

我也错过了。 –

+0

感谢您为我做的一天。 –

16

清除所有涂鸦在地图上使用

map.clear() 
+9

这将清除地图上的所有叠加层,而不仅仅是一个标记,因为这个问题暗示了 – Emzor

+0

谢谢,这个很好用 – Neela

-1

与添加在地图上的所有标记创建阵列。

后来,用途:

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

如果你想删除标记,你可以做到这一点作为marker.remove(); 另外,您还可以隐藏,而不是删除它作为

marker.setVisible(false); 
标记

,并在需要时随时显示。
2.但是,如果你想从地图中删除所有标记使用map.clear();
注:map.clear();还将删除Polylines, Circles
3.如果你不想删除Polylines, Circles等方面比使用循环标记的长度(如果您有多个标记)来删除那些Check out the Example here设置它们可见false并且在这种情况下不要使用map.clear();

12

标记添加到地图这样

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

然后你就可以使用remove方法,如果标记存在删除最后一个标记,将仅删除标记

markerName.remove(); 
2

。如果标记不存在创建当前标记

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

做一个全局变量保持标记的跟踪

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

这不会删除标记的图标 – Simon

1

使用下面的代码:

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

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

一旦你点击“标记”,你可以将其删除。

0

刚一说明,这东西我浪费了时间今晚追查......

如果你决定要守住出于某种原因的标志,您是从地图上删除后... getTag将返回NULL ,即使剩余的获取值将返回您创建标记时所设置的值...

如果您删除标记,然后尝试引用它,则TAG值将设置为NULL。

似乎对我来说是一个bug ...