android - 模拟器中永远不会调用 onMarkerClick()
问题描述
我想将 OnMarkerClickListener 注册到 GoogleMap:
- 实现 GoogleMap.OnMarkerClickListener 接口
- 通过 GoogleMap.setOnMarkerClickListener(this) 注册监听器
但是当我点击一个标记时,回调 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
}
有什么想法,怎么了?
解决方案
我知道了。当我将标记显示为一个集群(通过Google Maps Android Marker Clustering Utility)时,clustermanager 注册为 OnMarkerClickListener 并且我的侦听器的注册会丢失。作为一种解决方法,我省略了 clustermanager 注册,并自己在 clustermanager 上传递 click 事件。
推荐阅读
- javascript - 如何将每个空格都算作一个字符?
- python - 在同一文件夹中包含的 400 个 csv 文件上运行 python 脚本
- ios - 如何设置范围颜色以及如何在swift4的搜索栏中隐藏图标
- ios - 2 具有动态内容的滚动视图内的 UIcollectionview
- java - 单击时如何更改jButton值
- firebase - Google Cloud Firestore 安全规则 - 文档 ID 规则
- android - 当我在颤动中将语言设置为“马来西亚”时显示错误
- jxbrowser - 如果另一个浏览器使用 window.open 打开浏览器,则浏览器中的 executeJavaScriptAndReturnValue 返回的 JsValue 的 jsContext 为空
- mongodb - 是否可以以索引支持的方式在同一个数组上执行“$unwind”和“$sort”?
- c# - 在内存数据库提供程序中使用 EF core 对 asp.net core 应用程序进行单元测试的优势