如何在Android的Google Maps v2中知道点击了哪个标记?

11

我正在为Android制作一个带有Google Maps的应用程序,并在屏幕上放置了很多标记。当点击标记时,我正在准备可自定义的气球。这意味着,根据所点击的标记,我拥有不同的信息。

我使用setInfoWindowAdapter设置标记视图的内容,然后重写getInfoContents方法。

问题是:此方法是信息窗口内容的通用实现,但每个标记都应显示其自己的信息。因此,据我所理解,在getInfoContents(Marker marker)中必须以某种方式检测哪些标记已被单击,以从我的数据结构中加载必要的信息以显示在信息窗口上。问题是:我如何识别所单击的标记'marker'代表什么实体?我的意思是,在getInfoContents中只有触发显示信息窗口的对象Marker时,我如何检测要显示的正确信息?我考虑通过使用marker.getTitle()比较字符串Title来完成,但这会强制我在信息窗口上显示一个标题,而我不想这样做。还有一个marker.getId(),但该ID由API生成,我无法控制。

有任何想法吗?

6个回答

23

回复:

问题是:如何确定所点击的Marker“marker”代表哪个实体? [...] 还有一个marker.getId(),但这种ID是由API生成的,我无法控制

您可以控制它。Marker是通过addMarker()返回的,因此您可以获取其ID并存储它。下面是代码:

Map <String, Integer> markers = new HashMap<String, Integer>();

...

MarkerOptions mo = new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker))
.position(new LatLng(mLat, mLon))
.flat(true) 
.snippet("Click here for details")
.rotation(0)
.title(title);

在将标记添加到地图时,将其ID存储在容器上

MyClass myObject = new MyClass(lat, lon); // The class that you are rendering on the map with Markers, for example "Monument"
Marker mkr = map.addMarker(mo);
markers.put(mkr.getId(), myObject.getId()); 

然后当标记被点击时,你可以像这样恢复“myObject”的id:

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
    public void onInfoWindowClick(Marker marker) {
        int id = markers.get(marker.getId());
        // Now id contains which Monument (or your preferred class) was clicked                         
    }
});

在这种情况下,myObject是什么? - Fahad Saleem
1
嗨@FahadSaleem,myObject将是您想要与标记相关联的类。在我的情况下,它可能是一个“纪念碑”类或者一个“兴趣点”类,这样你就知道在Google地图上点击了哪个纪念碑。我已经更新了代码示例,现在可能更易读了。 - voghDev

5

有一个更好的选择,这也是谷歌建议的:

标记(Tag):与标记相关联的Object。例如,Object可以包含有关标记表示的数据。这比存储单独的Map<Marker,Object>更容易。另一个例子是,您可以将与数据集中的ID相对应的String ID关联起来。Google Maps Android API既不读取也不写入此属性。

来源

所以,您可以像这样做:

for (ListItem it: mList) {
    Marker mk = mMap.addMarker(new MarkerOptions().position(it.getLatLng()).title(it.getName()).snippet(it.getAddress()));
    mk.setTag(it.getID());
}

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Integer id = (Integer) marker.getTag();
        return false;
    }
});

3

当您设置标题时,您不必显示标题,因此您可以利用它,只要您从getInfoContents返回一个View,而不是在返回的View的任何子视图上使用setText与标题值。

根据您是否已经保留了所有标记的引用以及如何保留,有替代方案,例如如果您有List<Marker> policeMarkersList<Marker> badGuysMarkers,您可以使用条件语句if (policeMarkers.contains(marker)) { ... } else { ... }

您还可以保留Map<Marker, YourMarkerRelatedDataModel> allMarkers,并执行YourMarkerRelatedDataModel model = allMarkers.get(marker);,并使用该值进行区分。

最后,您可以使用Android Maps Extensions,它添加了像Marker.setData(Object)Object Marker.getData()这样的函数,以使您的模型接近您的标记,并且不会创建像Map<Marker, Model>这样的东西。


0
 mMap.setOnMarkerClickListener{
            Log.d(TAG , "easy")
            return@setOnMarkerClickListener true
        }

0

尝试这段代码:

@Override
    public void onInfoWindowClick(final Marker marker) 
    {
        // TODO Auto-generated method stub
       if (marker.getTitle().equalsIgnoreCase("Start")) {
        Toast.makeText(showMaps.this, "You have click on start -->",
                Toast.LENGTH_LONG).show();
        Log.e("marker.getPosition()-->", "" + marker.getPosition());
      }
    }

-1
  map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                public void onInfoWindowClick(Marker marker) {

                    double lat=marker.getPosition().latitude;
                    double lng=marker.getPosition().longitude;


                }
            });

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