谷歌地图Android版v2:在地图正在渲染时无法删除标记

3

我有一个包含以下内容的片段:

  • GoogleMap v2 片段
  • “places”按钮,用于添加标记(用户的地点)
  • “remove places”按钮(删除用户生成的标记)
  • 其他标记(例如一般的兴趣点)
  • 自定义瓦片覆盖层

当用户单击“places”按钮时,应用程序将散列映射与标记和地点对象引用存储在WeakHashMap中。当用户单击“remove places”时,应用程序会迭代Map键并调用marker.remove()。

当地图完全渲染时,标记将正确删除,但是如果在地图正在被渲染时按下按钮,则标记将无法删除。

有人遇到过同样的问题吗?如何解决?

我不能使用map.clear(),因为它会删除所有标记、折线、覆盖层等。我只想删除先前存储的标记列表(用户的位置),而不是全部删除。


1
为什么不使用clear()?https://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.html#clear() - Raghunandan
我有一个自定义瓦片提供者,当使用 clear() 方法时会被移除。此外,我有两个标记列表,分别表示不同的内容,我只想删除其中一个。 - Israel Varea
3个回答

3

您可以使用一些布尔值来检查地图是否已完成加载。如果没有,请延迟删除标记,直到地图加载完成。以下是一个例子:

private boolean mLoadFinished, mDelayRemove;

public void removeMarkers() {
    for (Marker marker : markers) {
        marker.remove();
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    ...

    Button button;
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mLoadFinished) {
                mDelayRemove = true;
            } else {
                removeMarkers();
            }
        }
    });

    mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
        @Override
        public void onMapLoaded() {
            mLoadFinished = true;
            if (mDelayRemove) {
                mDelayRemove = false;
                removeMarkers();
            }
        }
    });

    ...
}

有道理,但是在哪里将mLoadFinished设置为false呢? - Israel Varea
@SimpleLiving 基本上你不需要这样做。地图只有在 Activity 创建时才会被渲染。而且 mLoadFinished 变量将默认为 false。 - Simas
当我移动地图时,我可以看到正在填充的灰色瓦片。这不是“渲染”吗?还是仅仅是瓦片显示?因为问题在于当我移动地图或缩放时,我无法删除标记,而一些瓦片变成了灰色。 - Israel Varea
@SimpleLiving,由于瓦片下载基于用户网络,因此您无法检测瓦片下载何时完成。此外,在那个时间点上并不添加标记,因此您无法删除它们。我认为您甚至不想删除看不见的标记。用户如何知道他删除了什么? - Simas
问题在于当点击“删除按钮”时,标记未被移除,而地图正在下载瓦片(例如由于缩放或移动地图)。我最终解决了我的问题,但描述中没有足够的信息来解决它。请在几分钟后查看我的答案。顺便说一句,您的答案对于描述的问题是很好的,因此我已经为其投票。 - Israel Varea

1
GoogleMap.clear()会移除地图上所有标记。

如评论所述,我不能使用googleMap.clear(),因为它会额外删除覆盖物、折线等。我将把这个问题添加到描述中。 - Israel Varea

1
问题在于存储标记和位置对象之间关系的对象不应该是WeakHashMap而是HashMap。这解决了问题。

很遗憾,这些信息在你最初的问题中没有提供 :) 不过恭喜你解决了它。 - Simas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接