未调用centerOnMapLocation时其内mMap.clear为何会移除onMapLongClick添加的标记
问题原因
- 标记消失的核心原因是
centerOnMapLocation方法被其他业务逻辑间接触发了,最常见的场景是你注册了系统的定位更新回调,每次获取到新的位置信息时就会调用这个方法,方法内的mMap.clear()会清除地图实例上所有已添加的标记、折线、多边形等覆盖物,自然会把你长按添加的标记删掉。你虽然没在长按回调里调用这个方法,但只要定位更新触发了它,就会出现标记自动消失的现象。 - 另外你当前的
onMapLongClick实现存在参数错误:调用geocoder.getFromLocation时第二个参数错误传入了纬度,实际应该传经度,会导致你无法正确获取长按点的地址信息,这个问题和标记消失无关,属于额外的逻辑bug。
修复方案
1. 改造定位标记更新逻辑,避免全局清屏
不要在更新用户位置时调用mMap.clear(),改为单独维护用户位置的Marker实例,每次更新时只操作这个单独的Marker即可,不会影响其他自定义添加的标记。
首先在Activity中定义全局变量存储用户位置标记:
// 全局存储用户当前位置的标记实例 private Marker userLocationMarker;
修改centerOnMapLocation实现:
public void centerOnMapLocation (Location location, String title) { if (location == null) { return; } LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude()); // 仅移除旧的用户位置标记,不影响其他标记 if (userLocationMarker != null) { userLocationMarker.remove(); } // 添加新的用户位置标记 userLocationMarker = mMap.addMarker(new MarkerOptions().position(userLocation).title(title)); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 13)); }
2. 修复地理编码参数错误
修改onMapLongClick中的getFromLocation调用,把第二个参数改为经度:
// 修改前 // ArrayList<Address> addressArrayList = (ArrayList<Address>) geocoder.getFromLocation(latLng.latitude, latLng.latitude, 1); // 修改后 ArrayList<Address> addressArrayList = (ArrayList<Address>) geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
可选优化
如果后续有需要清空所有自定义标记的需求,可以单独维护一个长按添加的Marker列表,清空时遍历列表移除,避免影响用户位置标记。
内容的提问来源于stack exchange,提问作者jackq
相关产品推荐
相关产品推荐

