如何知道Google Maps v2 for Android上点击了哪个Marker?

时间:2013-05-11 11:44:08

标签: java android google-maps google-maps-markers

我正在为其制作带有Google地图的应用程序。我的屏幕上有很多标记,当我们点击它时,我正在为每个标记准备可定制的气球。这意味着,根据点击的标记,我有不同的信息。

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

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

有什么想法吗?

5 个答案:

答案 0 :(得分:20)

回复:

  

问题是:如何识别点击的标记'标记'代表哪个实体?   [...]   还有一个marker.getId(),但这样的ID是由API生成的,我无法控制它

你可以控制它。标记由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                         
    }
});

答案 1 :(得分:3)

如果您设置了标题,则没有义务显示标题,因此您可以使用该标题,只要您从View而不是getInfoContents返回任何子视图中的setText即可返回View的标题值。

根据您是否以及是否已经保留对所有标记的引用,有一些替代方法,例如:如果您有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>之类的内容。

答案 2 :(得分:3)

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

  

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

Source

所以你可以这样做:

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 :(得分: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());
      }
    }

答案 4 :(得分:-1)

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

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


                }
            });