如何使用Android Maps Utility库在Android中显示InfoWindow

9
我正在使用Google Maps Android API Utility Library来以聚类的方式在地图上展示多个标记。 我已经按照说明进行了操作,并查看了库中的示例,但我无法弄清如何在单击标记时显示InfoWindow。
我猜测getMap().setOnMarkerClickListener(mClusterManager)处理onClick事件。如果注释掉它,我可以使用getMap().setInfoWindowAdapter(new InfoWindowAdapter() {));重写它,但我无法访问自定义标记对象。 然而,如果我使用 getMap().setOnMarkerClickListener(mClusterManager);,我找不到一种方法来在单击标记后显示InfoWindow.
有人知道如何实现这个吗?
非常感谢!

你是指像这样的气球吗? https://dev59.com/cG865IYBdhLWcg3wTczh - Tristan
我认为这会对您有所帮助。 - Tristan
@Tristan 第一个链接已经过时了。第二个链接也不起作用,因为这里的方法是 onClusterClick(Cluster<MarkerItem> cluster),而且你可以看到 MarkerItem 是我的自定义对象,并没有 showInfoWindow() 方法。 - noloman
1个回答

23
你需要扩展DefaultClusterRenderer类并重写onBeforeClusterItemRendered,将标题附加到传递为参数的MarkerOptions对象中。
之后,你可以将你的实现传递给ClusterManager
例如:
class MyItem implements ClusterItem {

    private LatLng mPosition;
    private String mTitle;

    public MyItem(LatLng position){
        mPosition = position;
    }

    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    public String getTitle() {
        return mTitle;
    }

    public void setTitle(String title) {
        mTitle = title;
    }
}

class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {

    public MyClusterRenderer(Context context, GoogleMap map,
            ClusterManager<MyItem> clusterManager) {
        super(context, map, clusterManager);
    }

    @Override
    protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
        super.onBeforeClusterItemRendered(item, markerOptions);

        markerOptions.title(item.getTitle());
    }

    @Override
    protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
        super.onClusterItemRendered(clusterItem, marker);

        //here you have access to the marker itself
    }
}

然后你可以这样使用它:

ClusterManager<MyItem> clusterManager = new ClusterManager<MyItem>(this, getMap());
clusterManager.setRenderer(new MyClusterRenderer(this, getMap() ,clusterManager));

有没有办法定义一个自定义的 InfoWindow 来显示,或者你只能显示默认的? - noloman
谢谢。为什么要调用super.onBeforeClusterItemRendered?此外,我想在屏幕上点击时避免将项目/群集居中,因此我在onClusterClick和onClusterItemClick中返回true。问题是如果我返回true,则信息窗口不会显示,但如果返回false,则会显示(但首先会居中)。有什么帮助吗?提前致谢。 - Ricardo
@RiccardoCiovati,我在实现后没有看到任何信息窗口。manulorenzo!你有看到信息窗口吗? - Rethinavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接