You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为同一CustomInfoWindow的不同Marker设置不同点击事件

给不同Marker的自定义信息窗口设置不同点击事件

嘿,我来帮你搞定这个问题!你现在的问题是所有Marker的信息窗口点击都触发同一个跳转印度的事件,对吧?其实很简单,我们只需要给每个Marker做个专属标记,然后在点击事件里判断是哪个Marker,再执行对应的操作就可以啦。下面是具体的实现步骤,非常适合新手:

步骤1:给每个Marker添加专属标识

在你添加Marker的时候,给每个Marker设置一个唯一的标签(tag),或者利用Marker的title来区分。这里推荐用tag,因为title可能会显示在地图上,而tag是隐藏的标识,更灵活。

比如在onMapReady方法里添加Marker时:

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

    // 添加悉尼的Marker,并设置tag为"sydney"
    Marker sydneyMarker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(-34, 151)) // 悉尼的经纬度
            .title("悉尼")); // 可选,显示在Marker上的标题
    sydneyMarker.setTag("sydney"); // 给这个Marker打个标签

    // 添加印度的Marker,并设置tag为"india"
    Marker indiaMarker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(20.5937, 78.9629)) // 印度的经纬度
            .title("印度"));
    indiaMarker.setTag("india");

    // 剩下的18个Marker也按照这个方式添加,每个都设置唯一的tag,比如"london"、"newyork"等等
}

步骤2:修改点击事件,根据标识执行不同操作

接下来修改onInfoWindowClick方法,通过Marker的tag判断是哪个地点,然后执行对应的操作:

@Override
public void onInfoWindowClick(Marker marker) {
    // 获取Marker的tag
    String markerTag = (String) marker.getTag();
    
    // 判断tag,执行不同操作
    if (markerTag != null) {
        switch (markerTag) {
            case "sydney":
                // 悉尼的操作:显示Toast提示
                Toast.makeText(MapsActivity.this, "你点击了悉尼的信息窗口!", Toast.LENGTH_SHORT).show();
                break;
            case "india":
                // 印度的操作:跳转到India页面
                openIndia();
                break;
            // 可以继续添加其他Marker的case,比如:
            // case "london":
            //     // 伦敦的操作,比如打开LondonActivity
            //     Intent intent = new Intent(this, London.class);
            //     startActivity(intent);
            //     break;
            default:
                // 如果遇到未设置tag的Marker,显示默认提示
                Toast.makeText(MapsActivity.this, "该地点暂无对应操作", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

// 你原来的openIndia方法保持不变
public void openIndia(){
    Intent intent = new Intent(this,India.class);
    startActivity(intent);
}

新手友好的替代方案:用Marker的title判断

如果你觉得设置tag麻烦,也可以直接用Marker的title来判断(前提是每个Marker的title都是唯一的):

@Override
public void onInfoWindowClick(Marker marker) {
    String title = marker.getTitle();
    if ("悉尼".equals(title)) {
        Toast.makeText(this, "悉尼被点击啦!", Toast.LENGTH_SHORT).show();
    } else if ("印度".equals(title)) {
        openIndia();
    }
    // 其他地点的判断继续加else if就行
}

小提示

  • 如果你有20个Marker,建议把每个Marker的经纬度、tag、对应操作整理成一个列表或者对象,这样代码会更整洁,不过对于新手来说,先逐个添加也完全没问题。
  • 确保每个Marker的tag是唯一的,不然会出现多个Marker触发同一个事件的情况哦。

内容的提问来源于stack exchange,提问作者Atmospheric Productions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:28:10