我知道同一类别中还有其他一些问题,但没有任何问题可以解决我的问题。
我正在使用 ClusterManager 使用 Google Maps API 指南 ( https://developers.google.com/maps/documentation/android-api/utility/marker-clustering ) 对标记进行聚类。
问题:我在 ClusterManager 对象上使用 addItem(),传递位置以及标题和 fragment 。但是,当我单击标记时,什么也没有出现。我简化了代码来找出问题,但无法解决这个问题。
这是我的简化代码:
MyItem.java:
package com.example.android.testmarker.model;
import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.clustering.ClusterItem;
public class MyItem implements ClusterItem {
private final LatLng mPosition;
private String mTitle;
private String mSnippet;
public MyItem(double lat, double lng) {
mPosition = new LatLng(lat, lng);
}
public MyItem(double lat, double lng, String title, String snippet) {
mPosition = new LatLng(lat, lng);
mTitle = title;
mSnippet = snippet;
}
@Override
public LatLng getPosition() { return mPosition;}
public String getTitle() { return mTitle;}
public String getSnippet() { return mSnippet; }
}
MarkerclusterActivity.java:
package com.example.android.testmarker;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.example.android.testmarker.model.MyItem;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.maps.android.clustering.ClusterItem;
import com.google.maps.android.clustering.ClusterManager;
public class MarkerclusterActivity extends AppCompatActivity implements OnMapReadyCallback {
private final String TAG = this.getClass().getSimpleName();
GoogleMap mMap;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Log.v(TAG, "onCreated called");
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_map);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
Log.v(TAG, "onMapReady callback triggered");
mMap = map;
//restricting users panning to Vancouver dt area.
LatLngBounds limit = new LatLngBounds(new LatLng( 49.268642, -123.148639),
new LatLng( 49.300045, -123.095893));
//Add limit to our map
mMap.setLatLngBoundsForCameraTarget(limit);
mMap.setMinZoomPreference(13.0f);
//Set the initial camera to the center of downtown (where it says Vancouver)
LatLng initialLocation = new LatLng( 49.282733f, -123.120732f);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(initialLocation, 13.0f));
mClusterManager = new ClusterManager<MyItem>(this, map);
mMap.setOnCameraIdleListener(mClusterManager);
mMap.setOnMarkerClickListener(mClusterManager);
// Add cluster items (markers) to the cluster manager.
addItems();
}
private void addItems(){
mClusterManager.addItem(new MyItem(49.2831205, -123.1107811,
"Location54", "Garbage"));
mClusterManager.addItem(new MyItem(49.2839704, -123.1116479,
"Location 55", "Garbage"));
mClusterManager.addItem(new MyItem(49.2831205, -123.1135884,
"Location 58", "Garbage"));
mClusterManager.addItem(new MyItem(49.2816015, -123.1101502,
"Location 60", "Garbage"));
mClusterManager.addItem(new MyItem(49.2810562, -123.1083306,
"Location 69", "Garbage"));
//Add some locations a bit further from the ones above
mClusterManager.addItem(new MyItem( 49.283200, -123.126951));
mClusterManager.addItem(new MyItem( 49.283633, -123.136453));
mClusterManager.addItem(new MyItem( 49.285686, -123.130786));
}
}
现在,当我点击标记时,相机以标记为中心,默认的GoogleMaps按钮(方向,googlemaps按钮)出现在右下角(意味着标记点击事件被触发);但是,它从不显示标题/fragment 。
注意:我已经在 Google Maps API 的演示应用程序中尝试过这一点,它无需添加任何其他内容即可工作;然而,由于他们的演示使用了太多的类,我无法查明问题所在。
提前致谢
最佳答案
Here is how I did it: KOTLIN version
//adding items to cluster
mCustomerClusterManager.addItems(customerAroundMeItems)
mEquipmentClusterManager.addItems(equipmentAroundMeItems)
override fun onMapReady(googleMap: GoogleMap?) {
this.googleMap = googleMap
//Step 1
val markerManager = MarkerManager(googleMap) // your googleMap instance
//Step 2
mEquipmentClusterManager = ClusterManager(activity, googleMap, markerManager)
mCustomerClusterManager = ClusterManager(activity, googleMap, markerManager)
googleMap.setOnMarkerClickListener(markerManager)
googleMap.setOnCameraIdleListener(this)
//Step 3
val rendererCustomer =CustomerAroundMeMapPinsCluster(activity,googleMap, mCustomerClusterManager)
val rendererEquipmentRental = EquipmentAroundMeMapPinsCluster(activity,googleMap,mEquipmentClusterManager)
//Step 4
mCustomerClusterManager.setOnClusterClickListener {
Toast.makeText(context, "Customer Cluster click", Toast.LENGTH_SHORT).show()
onClusterClick(it)
return@setOnClusterClickListener false
}
mCustomerClusterManager.setOnClusterItemClickListener {
Toast.makeText(context, "Customer item click", Toast.LENGTH_SHORT).show()
return@setOnClusterItemClickListener false
}
mEquipmentClusterManager.setOnClusterClickListener {
Toast.makeText(context, "Equipment Cluster click", Toast.LENGTH_SHORT).show()
return@setOnClusterClickListener true
}
mEquipmentClusterManager.setOnClusterItemClickListener {
// there is a ticket for this
Toast.makeText(context, "Equipment item clicked", Toast.LENGTH_SHORT).show()
return@setOnClusterItemClickListener false
}
mCustomerClusterManager.renderer = rendererCustomer
mEquipmentClusterManager.renderer = rendererEquipmentRental
}
override fun onCameraIdle() {
mEquipmentClusterManager.cluster()
mCustomerClusterManager.cluster()
}
关于android - onMarkerClick 事件不适用于 ClusterManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49120925/