android - onMarkerClick 事件不适用于 ClusterManager

标签 android google-maps

我知道同一类别中还有其他一些问题,但没有任何问题可以解决我的问题。

我正在使用 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/

相关文章:

android - 谷歌地图坐标与苹果 map 不同

google-maps - 可以在Google静态 map 上画一个圆吗?

android - 在 RecyclerView 中按组划分元素

java - 一个布局放在另一个布局之上?

android - 将 Set<BluetoothDevice> 转换为 BluetoothDevice[]

javascript - 谷歌回调API

javascript - 有没有办法按国家对谷歌地图标记进行聚类?

ios - 动态调整 xib 大小

Android 在来电时关闭媒体服务

android - Json 数组在 Android 中解析时返回 null