Android,如何从 Google Map V2 中删除所有标记?
Posted
技术标签:
【中文标题】Android,如何从 Google Map V2 中删除所有标记?【英文标题】:Android, How to remove all markers from Google Map V2? 【发布时间】:2013-05-27 00:47:16 【问题描述】:我的片段中有地图视图。我需要刷新地图并根据条件添加不同的标记。所以,我应该在添加新标记之前从地图中删除最后一个标记。
实际上,几周前应用程序运行良好,但突然发生了。我的代码是这样的:
private void displayData(final List<Venue> venueList)
// Removes all markers, overlays, and polylines from the map.
googleMap.clear();
.
.
.
上次运行良好(在 android 团队在 2013 年 I/O 上宣布新的 Google Map API 之前)。然而,在那之后我调整了我的代码以使用这个新的 API。现在,我不知道为什么这种方法googleMap.clear();
不起作用!
任何建议将不胜感激。谢谢
=======
更新
=======
完整代码:
private void displayData(final List<Venue> venueList)
// Removes all markers, overlays, and polylines from the map.
googleMap.clear();
// Zoom in, animating the camera.
googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);
// Add marker of user's position
MarkerOptions userIndicator = new MarkerOptions()
.position(new LatLng(lat, lng))
.title("You are here")
.snippet("lat:" + lat + ", lng:" + lng);
googleMap.addMarker(userIndicator);
// Add marker of venue if there is any
if(venueList != null)
for(int i=0; i < venueList.size(); i++)
Venue venue = venueList.get(i);
String guys = venue.getMaleCount();
String girls= venue.getFemaleCount();
String checkinStatus = venue.getCan_checkin();
if(checkinStatus.equalsIgnoreCase("true"))
checkinStatus = "Checked In - ";
else
checkinStatus = "";
MarkerOptions markerOptions = new MarkerOptions()
.position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
.title(venue.getName())
.snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));
googleMap.addMarker(markerOptions);
// Move the camera instantly to where lat and lng shows.
if(lat != 0 && lng != 0)
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));
googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter()
@Override
public View getInfoWindow(Marker marker)
return null;
@Override
public View getInfoContents(Marker marker)
return null;
);
googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
@Override
public void onInfoWindowClick(Marker marker)
String str = marker.getId();
Log.i(TAG, "Marker id: " + str);
str = str.substring(1);
int markerId = Integer.parseInt(str);
markerId -= 1; // Because first item id of marker is 1 while list starts at 0
Log.i(TAG, "Marker id " + markerId + " clicked.");
// Ignore if User's marker clicked
if(markerId < 0)
return;
try
Venue venue = venueList.get(markerId);
if(venue.getCan_checkin().equalsIgnoreCase("true"))
Fragment fragment = VenueFragment.newInstance(venue);
if(fragment != null)
changeFragmentLister.OnReplaceFragment(fragment);
else
Log.e(TAG, "Error! venue shouldn't be null");
catch(NumberFormatException e)
e.printStackTrace();
catch(IndexOutOfBoundsException e)
e.printStackTrace();
);
【问题讨论】:
好吧,我已经尝试过了,clear()
有效。你一定是做错了什么……
我调用了这个方法两次。第一个没有问题。第二次这条线没有清除标记并向地图添加新标记(与旧标记一起)。所以,我对正在发生的事情感到困惑。
感谢您的确认。我会尝试再次检查,也许你是对的,我做错了什么:(
【参考方案1】:
好吧,我终于找到了一种替代方法来解决我的问题。有趣的问题是,当您为地图分配标记时,它的 id 是“m0”。当您从地图中删除它并分配新标记时,您希望 id 应该是“m0”,但它是“m1”。因此,它向我表明该 id 是不可信的。所以我在片段的onActivityCreated()
的某处定义了List<Marker> markerList = new ArrayList<Marker>();
。
然后将上面的代码更改为以下代码。如果他们有类似的标记问题,希望它可以帮助其他人。
private void displayData(final List<Venue> venueList)
Marker marker;
// Removes all markers, overlays, and polylines from the map.
googleMap.clear();
markerList.clear();
// Zoom in, animating the camera.
googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);
// Add marker of user's position
MarkerOptions userIndicator = new MarkerOptions()
.position(new LatLng(lat, lng))
.title("You are here")
.snippet("lat:" + lat + ", lng:" + lng);
marker = googleMap.addMarker(userIndicator);
// Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
markerList.add(marker);
// Add marker of venue if there is any
if(venueList != null)
for (Venue venue : venueList)
String guys = venue.getMaleCount();
String girls = venue.getFemaleCount();
String checkinStatus = venue.getCan_checkin();
if (checkinStatus.equalsIgnoreCase("true"))
checkinStatus = "Checked In - ";
else
checkinStatus = "";
MarkerOptions markerOptions = new MarkerOptions()
.position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
.title(venue.getName())
.snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));
marker = googleMap.addMarker(markerOptions);
// Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
markerList.add(marker);
// Move the camera instantly to where lat and lng shows.
if(lat != 0 && lng != 0)
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));
googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter()
@Override
public View getInfoWindow(Marker marker)
return null;
@Override
public View getInfoContents(Marker marker)
return null;
);
googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
@Override
public void onInfoWindowClick(Marker marker)
int markerId = -1;
String str = marker.getId();
Log.i(TAG, "Marker id: " + str);
for(int i=0; i<markerList.size(); i++)
markerId = i;
Marker m = markerList.get(i);
if(m.getId().equals(marker.getId()))
break;
markerId -= 1; // Because first item of markerList is user's marker
Log.i(TAG, "Marker id " + markerId + " clicked.");
// Ignore if User's marker clicked
if(markerId < 0)
return;
try
Venue venue = venueList.get(markerId);
if(venue.getCan_checkin().equalsIgnoreCase("true"))
Fragment fragment = VenueFragment.newInstance(venue);
if(fragment != null)
changeFragmentLister.OnReplaceFragment(fragment);
else
Log.e(TAG, "Error! venue shouldn't be null");
catch(NumberFormatException e)
e.printStackTrace();
catch(IndexOutOfBoundsException e)
e.printStackTrace();
catch (NullPointerException e)
e.printStackTrace();
);
【讨论】:
如何在不使用clear()
方法的情况下从ArrayList
或MarkerArray
中删除所有标记【参考方案2】:
如果您想清除“地图上的所有标记、叠加层和折线”,请在您的 GoogleMap 上使用clear()
。
【讨论】:
热烈欢迎亲爱的 Ahmad 加入 ***。为了防止投票失败,请在回答问题之前阅读其他答案,尤其是接受的答案。 它帮助 *** 的数据库不被重复的答案所淹没。谢谢。【参考方案3】:使用map.clear()
从谷歌地图中删除所有标记
【讨论】:
【参考方案4】:假设有 2 个位置的 ArrayList
。现在,您根据该数组在地图上显示标记。会有两个标记。当您单击第一个标记时,它会给您一个标记索引m0
,第二个是m1
。
假设您刷新了位置数组,现在您得到了一个包含 3 个位置的数组。你有3个标记。但是当你点击第一个时,它会给你标记索引m2
(好像它从第一个位置箭头继续计数)第二个是m3
,第三个是m4
。您真正想要的是将其设为m0
、m1
、m2
。
现在,当您构建位置数组时,您可能会调用location.add("you location")
...,当您重建它(刷新它)时,您首先调用location.clear()
,然后再次构建它。
解决方案:
首先,制作另一个类似于位置数组的虚拟数组,并在for
循环中与真实位置数组一起构建它:locaionDummy.add(i)
但你永远不要刷新它 - 那样不断建设,你会知道你从一开始就有多少个地点。
其次,使用mIndex
作为int
变量做这样的事情(设置图像的示例):
void locatePins()
mIndex = locationDummy.size()-location.size();
for (int i = 0; i < userID.size(); i++)
LatLng pgLocation = new LatLng(Double.parseDouble(latArr.get(i)), Double.parseDouble(lngArr.get(i)));
myMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter()
@Override
public View getInfoWindow(Marker marker)
View view = getLayoutInflater().inflate(R.layout.map_marker_info, null);
RelativeLayout markerInfo= view.findViewById(R.id.markerInfo);
TextView name = view.findViewById(R.id.userName);
TextView details = view.findViewById(R.id.userInfo);
ImageView img = view.findViewById(R.id.userImg);
name.setText(marker.getTitle());
details.setText(marker.getSnippet());
img.setImageBitmap (bmImg.get(Integer.parseInt(marker.getId().replaceAll("[^\\d.]", ""))-mIndex));
return view;
@Override
public View getInfoContents(Marker marker)
return null;
// ... the rest of the code
关键是从locationDummy.size()
中减去真正的location.size()
得到一个数字int mIndex
,您稍后将从marker.getId()
中减去该数字
【讨论】:
【参考方案5】:如果您只需要删除标记,而将其他东西(例如地面覆盖物等)留在那里,请使用:
marker.remove();
或者如果你有很多:
if(markers!=null&&mMap!=null)
for(int i=0;i<markers.size();i++)
markers.get(i).remove();
在哪里
List<Marker> markers = new ArrayList<>();
【讨论】:
以上是关于Android,如何从 Google Map V2 中删除所有标记?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android google map v2 实现上为 geoserver 瓦片重新加载 TileOverlay
在 android 中扩展 google map api v2 的离线矢量 TileProvider
Google Map Android API V2 中两个位置之间的旅行时间
Android onLocationChanged with Direction使用Google Map Api v2