如何解决osmdroid MapView中按索引移除Overlay无效的问题?
解决osmdroid中KMZ Overlay无法按索引移除的问题
问题根源
你在添加Overlay时,同时将kmzOverlay加入了两个容器:kmzFolderOverlay和mapView.getOverlays()。仅移除mapView.getOverlays()中的实例时,kmzFolderOverlay内的Overlay仍会被地图渲染,导致看起来没移除。
解决方案
根据你的Overlay管理方式,选择对应移除逻辑:
方式1:仅通过kmzFolderOverlay管理Overlay(推荐)
如果kmzFolderOverlay已经被添加到mapView.getOverlays(),直接从文件夹中移除目标Overlay即可:
// 正确添加流程(仅将Overlay加入文件夹,再把文件夹加到地图) kmzOverlay.setName(fileName); kmzFolderOverlay.add(kmzOverlay); mapView.getOverlays().add(kmzFolderOverlay); // 确保文件夹在地图Overlay列表中 mapView.invalidate(); // 移除操作 kmzFolderOverlay.remove(kmzOverlay); // 或按文件夹内的索引移除:kmzFolderOverlay.remove(folderIndex) mapView.invalidate();
方式2:同时在两个容器中添加了Overlay,需两处都移除
如果必须同时维护两个容器的Overlay实例,需要分别移除:
// 移除mapView顶层Overlay列表中的实例 mapView.getOverlays().remove(mapIndex); // 移除文件夹中的实例 kmzFolderOverlay.remove(kmzOverlay); // 或按文件夹内索引移除 mapView.invalidate();
额外排查点
- 确认移除的索引准确:通过
mapView.getOverlays().size()或打印Overlay列表,验证索引指向的是目标Overlay。 - 确保
invalidate()在主线程执行:osmdroid的UI刷新操作必须在主线程调用,子线程调用不会触发地图重绘。
内容的提问来源于stack exchange,提问作者Ali Hosein pour
相关产品推荐
相关产品推荐

