【问题标题】:Check if Marker on Map has been removed - Android [duplicate]检查地图上的标记是否已被删除 - Android [重复]
【发布时间】:2020-06-22 11:46:17
【问题描述】:

我如何从我的 Marker 对象中知道它是否已从 Google 地图中删除。我不感兴趣的是显示/隐藏。我对“删除()”感兴趣。即使在marker.remove() 之后,isVisible 也适用于该标记。那我怎么知道呢?

有人要求提供示例代码来重现。这里是:

override fun onMapReady(googleMap: GoogleMap) {
    this.googleMap = googleMap

    val markerOptions = MarkerOptions()
    markerOptions.position(LatLng(31.520959,74.352154))
  markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.curr_loc_grey))
    val marker = googleMap.addMarker(markerOptions)
   /........../
    marker.remove()
}

我正在使用

api 'com.google.maps:google-maps-services:0.10.2'

我在调试的时候,看到marker.isVisible添加的时候是true,在remove()之后一直是true。是bug吗?

【问题讨论】:

  • 这不可能。
  • @MrUpsidown 什么不可能是真的?可见吗?嗯,它是。你验证了吗?
  • 验证?什么?您必须提供 minimal reproducible example 以便对其进行验证。根据文档,您的陈述不可能是真的。出于同样的原因,您有 2 票赞成票,并且到目前为止尚未更新您的问题。
  • @MrUpsidown 文档在哪里?它是简单的marker.remove()。我也为你添加并测试了代码。看看
  • public void remove () 从地图中删除此标记。删除标记后,其所有方法的行为都未定义。

标签: android google-maps marker


【解决方案1】:

无论如何,您可以在将标记添加到地图的同时将其添加到 HashSet:

...
HashSet<Makrer> markersOnMap = new HashSet<>();
...

...
// when add marker to map
Marker marker = googleMap.addMarker(markerOptions);
markersOnMap.add(marker);
...

...
// when remove
markersOnMap.remove(marker);
marker.remove();
...

...
// when check is marker on map
if (markersOnMap.contains(marker)) {
    // marker is on map   
} else {
    // marker removed   
}

当然,这只是方法描述,不是最终代码。

更新:

您可以创建基于MapView/MapFragment 的自定义组件并继承HashSet 交互。类似的东西:

public class MarkesrMapView extends MapView implements OnMapReadyCallback {

    private OnMapReadyCallback mMapReadyCallback;
    private GoogleMap mGoogleMap;
    private HashSet<Makrer> mMarkersOnMap;

    public MarkersMapView(@NonNull Context context) {
        super(context);
        init();
    }

    public MarkersMapView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MarkersMapView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public MarkersMapView(@NonNull Context context, @Nullable GoogleMapOptions options) {
        super(context, options);
        init();
    }

    private void init() {
        mMarkersOnMap = new HashSet<>();
    }

    @Override
    public void getMapAsync(OnMapReadyCallback callback) {
        mMapReadyCallback = callback;
        super.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;
        if (mMapReadyCallback != null) {
            mMapReadyCallback.onMapReady(googleMap);
        }
    }

    public Marker addMarker(MarkerOptions markerOptions) {
        Marker marker = mGoogleMap.addMarker(markerOptions);
        mMarkersOnMap.add(marker);
        return marker;
    }

    public void removeMarker(Marker marker) {
        if (marker == null) return;
        mMarkersOnMap.remove(marker);
        marker.remove();
    }

    public boolean isOnMap(Marker marker) {
        if (marker == null) return false;
        return mMarkersOnMap.contains(marker);
    }
}

并像这样使用它:

...
private markersMapView mMapView;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Bundle mapViewBundle = null;
    if (savedInstanceState != null) {
        mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
    }

    mMapView = (MarkersMapView) findViewById(R.id.mapview);
    mMapView.onCreate(mapViewBundle);
    mMapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mGoogleMap = googleMap;
            mMapView.addMarker(new MarkerOptions().position(...).title("Marker"));
        }
    });

   ...
   if (mMapView.isOnMap(myMarker)) {
      ...
   }

.isOnMap() 可以是非常简单的调用(尤其是在没有其他方法的情况下)。

【讨论】:

  • 不适合我。需要进行一些简单的调用来检查。
猜你喜欢
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多