Android谷歌地图,如何让每个Marker InfoWindow打开不同的Activity?

Posted

技术标签:

【中文标题】Android谷歌地图,如何让每个Marker InfoWindow打开不同的Activity?【英文标题】:Android Google Maps, how to make each Marker InfoWindow open different Activity? 【发布时间】:2015-08-16 14:07:37 【问题描述】:

我使用以下代码段在谷歌地图上显示几个位置。我将这些坐标作为数组获取。在地图上显示标记后,我想在单击标记的信息窗口后进行活动。单个标记的每个信息窗口在单击后应该具有不同的活动。我有 4 个标记,我想通过单击信息窗口访问 4 个不同的活动。我应该如何实现这一点。谢谢

我在地图上放置标记的代码

     Marker a1 = googleMap.addMarker(new MarkerOptions().position(a)
                .title(arr[0])
                .snippet(arr[1])            );
       Marker b1 = googleMap.addMarker(new MarkerOptions().position(b)
                .title(arr[9])
                .snippet(arr[10])                 );
        Marker c1= googleMap.addMarker(new MarkerOptions().position(c)
                .title(arr[18])
                .snippet(arr[19]));
        Marker d1= googleMap.addMarker(new MarkerOptions().position(d)
                .title(arr[27])
                .snippet(arr[28])); 

【问题讨论】:

【参考方案1】:

使用 HashMap 来存储标记 ID 以及它应该打开哪个 Activity 的对应标识。

然后,使用OnInfoWindowClickListener 获取用户点击信息窗口的事件,并使用HashMap 来确定要打开哪个Activity。

将HashMap声明为实例变量:

//Declare HashMap to store mapping of marker to Activity
HashMap<String, String> markerMap = new HashMap<String, String>();

然后,每次添加 Marker 时,在 HashMap 中创建一个条目:

        String id = null;

        Marker a1 = googleMap.addMarker(new MarkerOptions().position(a)
                .title(arr[0])
                .snippet(arr[1]));

        id = a1.getId();
        markerMap.put(id, "a1");

        Marker b1 = googleMap.addMarker(new MarkerOptions().position(b)
                .title(arr[9])
                .snippet(arr[10]));

        id = b1.getId();
        markerMap.put(id, "b1");

        Marker c1= googleMap.addMarker(new MarkerOptions().position(c)
                .title(arr[18])
                .snippet(arr[19]));

        id = c1.getId();
        markerMap.put(id, "c1");

        Marker d1= googleMap.addMarker(new MarkerOptions().position(d)
                .title(arr[27])
                .snippet(arr[28]));

        id = d1.getId();
        markerMap.put(id, "d1");
    

然后定义信息窗口点击监听:

    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 
        @Override
        public void onInfoWindowClick(Marker marker) 

            String m = markerMap.get(marker.getId());

            if (m.equals("a1"))
                Intent i = new Intent(MainActivity.this, ActivityA1.class);
                startActivity(i);
            
            else if (m.equals("b1"))
                Intent i = new Intent(MainActivity.this, ActivityB1.class);
                startActivity(i);
            
            else if (m.equals("c1"))
                Intent i = new Intent(MainActivity.this, ActivityC1.class);
                startActivity(i);
            
            else if (m.equals("d1"))
                Intent i = new Intent(MainActivity.this, ActivityD1.class);
                startActivity(i);
            
        
    );

【讨论】:

@janithachanuka 没问题!很高兴它对你有用!【参考方案2】:

我可以看到多个字段是链接在一起的:

标题 片段 位置 活动

您可以通过以下方式在代码中完成此操作:

    创建自定义类:

    public static class MyMarker 
    
        Marker marker;
        MarkerOptions options = new MarkerOptions();
        Class activity;
    
        public MyMarker(String title, String snippet, LatLng position, Class activity) 
            // MarkerOptions
            options.title(title)
                    .snippet(snippet)
                    .position(position);
    
            // Target activity
            this.activity = activity;
        
    
        // Compare Marker variable instead of MyMarker
        @Override
        public boolean equals(Object o) 
            return o != null && o.equals(marker);
        
    
    

    准备标记:

    final List<MyMarker> myMarkers = new ArrayList<>();
    myMarkers.add(new MyMarker("title1", "snippet1", new LatLng(10, 10), MainActivity1.class));
    myMarkers.add(new MyMarker("title2", "snippet2", new LatLng(20, 20), MainActivity2.class));
    

    将标记添加到 GoogleMap 并保存返回的对象:

    for (MyMarker myMarker : myMarkers) 
        myMarker.marker = googleMap.addMarker(myMarker.options);
    
    

    为您的地图添加一个标记点​​击监听器:

    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
        @Override
        public boolean onMarkerClick(Marker marker) 
            // Will use the overridden equals method
            int index = myMarkers.indexOf(marker);
            if (index != -1) 
                // Considering that MainActivity is the current activity
                Intent intent = new Intent(MainActivity.this, myMarkers.get(index).activity);
                startActivity(intent);
            
            return false;
        
    );
    

上面的监听器会在你添加的标记数组中寻找被点击的标记,如果它在那里,将启动相关的活动。

【讨论】:

我没试过这个。但是你已经提供了一个明确的答案感谢你的工作(y)

以上是关于Android谷歌地图,如何让每个Marker InfoWindow打开不同的Activity?的主要内容,如果未能解决你的问题,请参考以下文章

无法单击标记 - 谷歌地图集群Android,无法在谷歌地图中显示信息窗口

单击其他时更改谷歌地图标记图标

如何更改谷歌地图中标记的颜色?

如何从谷歌地图标记中获取视图?

android 百度地图如何实现点击地图添加marker,每点击一次添加一个标注并且之前的标注不消失,如何实现?

android 高德地图sdk,在地图上我点击了某个marker,然后这个被点击的marker就被自动定位