![](/img/trans.png)
[英]How to pass an object to Google Maps Android API V2 Marker?
[英]How to know which Marker was clicked on Google Maps v2 for Android?
我正在为 Android 制作一个带有谷歌地图的应用程序。 我的屏幕上有很多标记,我正在为每个标记准备可自定义的气球,当它们被点击时。 这意味着,根据点击的标记,我有不同的信息。
我使用 setInfoWindowAdapter 设置标记视图的内容,然后覆盖方法 getInfoContents。
问题是:这个方法是Info Window内容的一般实现,但是每个marker都要显示自己的信息。 因此,据我所知,我必须以某种方式在 getInfoContents(Marker marker) 上检测哪些标记已被单击,以便从我的数据结构加载必要的信息以显示在信息窗口上。 问题是:我如何识别点击的标记“标记”代表什么实体? 我的意思是,只有 getInfoContents 上的对象 Marker 被触发以显示信息窗口,我如何检测要显示的正确信息? 我想通过使用marker.getTitle() 来比较字符串Title,但这迫使我在信息窗口上显示一个标题,这是我不想要的。 还有一个marker.getId(),但是这个ID是API生成的,我控制不了
有任何想法吗?
回复:
问题是:我如何识别点击的标记“标记”代表什么实体? [...] 还有一个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
}
});
有一个更好的选择,这就是谷歌建议的:
标签:与标记关联的
Object
。 例如,Object
可以包含有关标记代表什么的数据。 这比存储单独的Map<Marker, Object>
更容易。 再举一个例子,您可以将一个String
ID 与数据集中的 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;
}
});
您没有义务显示标题,当你有它设置,使您可以根据返回使用,并且只要View
从getInfoContents
,而不是setText
对返回的任何子视图View
与标题值。
根据您是否以及是否已经保留对所有标记的引用,还有其他选择,例如,如果您有List<Marker> policeMarkers
和List<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>
。
试试这个代码:
@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());
}
}
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
public void onInfoWindowClick(Marker marker) {
double lat=marker.getPosition().latitude;
double lng=marker.getPosition().longitude;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.