【问题标题】:Android Google Maps, how to make each Marker InfoWindow open different Activity?Android谷歌地图,如何让每个Marker InfoWindow打开不同的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])); 

【问题讨论】:

    标签: android google-maps


    【解决方案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】:

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

    • 标题
    • 片段
    • 位置
    • 活动

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

    1. 创建自定义类:

      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);
          }
      }
      
    2. 准备标记:

      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));
      
    3. 将标记添加到 GoogleMap 并保存返回的对象:

      for (MyMarker myMarker : myMarkers) {
          myMarker.marker = googleMap.addMarker(myMarker.options);
      }
      
    4. 为您的地图添加一个标记点​​击监听器:

      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)
    猜你喜欢
    • 2012-10-12
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2018-03-17
    相关资源
    最近更新 更多