首页 > 解决方案 > 模拟器中永远不会调用 onMarkerClick()

问题描述

我想将 OnMarkerClickListener 注册到 GoogleMap:

但是当我点击一个标记时,回调 onMarkerClick() 永远不会被调用。出于测试目的,我还实现了 OnMapLongClickListener 并且效果很好。

public class ShowCoords extends FragmentActivity implements
    OnMapReadyCallback,
    LocationListener,
    GoogleMap.OnCameraMoveListener,
    GoogleMap.OnCameraMoveStartedListener,
    GoogleMap.OnMyLocationButtonClickListener,
    GoogleMap.OnMyLocationClickListener,
    GoogleMap.OnMarkerClickListener,
    GoogleMap.OnMapLongClickListener {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.show_coords);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    mMap.getUiSettings().setZoomControlsEnabled(true);
    mMap.getUiSettings().setScrollGesturesEnabled(true);
    mMap.getUiSettings().setCompassEnabled(true);
    mMap.getUiSettings().setMapToolbarEnabled(false);

    if (gpsPermission()) {
        mMap.setMyLocationEnabled(true);
    }
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMyLocationClickListener(this);
    mMap.setOnCameraMoveStartedListener(this);
    mMap.setOnCameraMoveListener(this);

    mMap.setOnMarkerClickListener(this);

    mMap.setOnMapLongClickListener(this);

    if (displayFormat.equals(getString(R.string.heatmapValue))) {
        // display markers as heatmap
    } else if (displayFormat.equals(getString(R.string.clusterValue))) {
        // diplay markers as cluster 
        mClusterManager = new ClusterManager<>(this, mMap);
        mMap.setOnCameraIdleListener(mClusterManager);
        // this causes the problem
        mMap.setOnMarkerClickListener(mClusterManager);

        for (LatLng p : coords) {
            mClusterManager.addItem(new MyClusterItem(p));
        }
    } else {
        Log.w(TAG, "onMapReady: coords still null, nothing to display");
    }

    //just for testing
    mMap.addMarker(new MarkerOptions().position(new LatLng(51.866404, 12.643411)));
}

@Override
public boolean onMarkerClick(Marker marker) {        
    Log.i(TAG, "onMarkerClick");
    return true;
}

@Override
public void onMapLongClick(LatLng latLng) {
    Log.i(TAG, "onMapLongClick");
}

// removed other callbacks
}

有什么想法,怎么了?

标签: android

解决方案


我知道了。当我将标记显示为一个集群(通过Google Maps Android Marker Clustering Utility)时,clustermanager 注册为 OnMarkerClickListener 并且我的侦听器的注册会丢失。作为一种解决方法,我省略了 clustermanager 注册,并自己在 clustermanager 上传递 click 事件。


推荐阅读