You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未调用centerOnMapLocation时其内mMap.clear为何会移除onMapLongClick添加的标记

问题原因
  1. 标记消失的核心原因是centerOnMapLocation方法被其他业务逻辑间接触发了,最常见的场景是你注册了系统的定位更新回调,每次获取到新的位置信息时就会调用这个方法,方法内的mMap.clear()会清除地图实例上所有已添加的标记、折线、多边形等覆盖物,自然会把你长按添加的标记删掉。你虽然没在长按回调里调用这个方法,但只要定位更新触发了它,就会出现标记自动消失的现象。
  2. 另外你当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:36:03