Java 单击“信息侦听器”窗口Google Maps V2
我有一个简单的“地点”课程: 我在这样的数组列表中添加了“Places:(注意名称是非唯一的) 我想知道如何为要添加到地图的每个标记添加侦听器。我试着用Java 单击“信息侦听器”窗口Google Maps V2,java,android,google-maps,google-maps-markers,Java,Android,Google Maps,Google Maps Markers,我有一个简单的“地点”课程: 我在这样的数组列表中添加了“Places:(注意名称是非唯一的) 我想知道如何为要添加到地图的每个标记添加侦听器。我试着用 map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { } }); 但是,我能做的唯一一件事就
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
}
});
但是,我能做的唯一一件事就是获取标记的标题,它不是唯一的,因此我无法真正找到正在单击的确切“位置”对象。有什么想法吗?谢谢以这种方式编辑您的循环
for(Place place : places) {
Marker marker = map.addMarker(new MarkerOptions().position(place.latlng).title(place.name);
place.markerId = marker.getId();
}
当然,您需要将变量markerid添加到place
getId()
然后在信息窗口ClickListener中,您可以通过markerId找到位置。我使用对象的键来找到它 例如,我有两个地方: 地点1:name=“test”,address=“test2”,id=0
地点2:name=“test”,address=“test2”,id=1 在标记中,如果我使用此选项,它们看起来是相同的:
map.addMarker(new MarkerOptions().position(latlng)
.title(name).snippet(address);
因此,为了区分它们,我将代码修改为:
map.addMarker(new MarkerOptions().position(latlng)
.title(id+"-"name).snippet(address);
在infoWindowClickListener中,我只是通过
String id=marker.getTitle().substring(0,1);//if your places are < 10
String id=marker.getTitle().substring(0,1)//如果你的位置<10
第二条路
正在刷新您的自定义信息窗口
并创建对象“位置”
我建议使用
HashMap
private HashMap<Marker, Place> markerMap = new HashMap<Marker, Place>();
在你的听众中:
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Place place = markerMap.get(marker);// here you get your exact Place Object
}
});
您可以使用调用
标记
上的getPosition()
返回的LatLng
对象来唯一标识每个标记
,并在位置
数组中查找匹配项
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
LatLng latLon = marker.getPosition();
//Cycle through places array
for(Place place : places){
if (latLon.equals(place.latlng)){
//match found! Do something....
}
}
}
});
文件:
我有一个方法来获取标记的索引,您可以使用它来获取位置中的元素
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Log.i("MAP", "the index of this element is: " + String.valueOf(getMarkerIndex(marker.getId())));
}
});
getMarkerIndex()方法:
看来这是我最好的选择。将在我测试它时更新。谢谢这不是最好的。HashMap占用内存,速度有点慢。@在这种情况下,我认为它比每次用户单击标记时循环所有位置更为理想。@user1282637当然,没问题!您还可以向每个
标记添加一个唯一的代码段
,并使用它。没错,我可以将Place.id放入代码段中…感谢您的帮助我使用了您的LatLng解决方案。这是最简单的实现。这显然不适用于两个地址相同的地方(即购物中心的商店),但我的应用程序没有这个问题。谢谢你的帮助
private HashMap<Marker, Place> markerMap = new HashMap<Marker, Place>();
for(Place place : places){
MarkerOption marker =new MarkerOptions().position(place.latlng).title(place.name);
map.addMarker(marker);
markerMap.put(marker, place)
}
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Place place = markerMap.get(marker);// here you get your exact Place Object
}
});
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
LatLng latLon = marker.getPosition();
//Cycle through places array
for(Place place : places){
if (latLon.equals(place.latlng)){
//match found! Do something....
}
}
}
});
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Log.i("MAP", "the index of this element is: " + String.valueOf(getMarkerIndex(marker.getId())));
}
});
private int getMarkerIndex(String index){
int myIndex = -1;
try{
myIndex = Integer.parseInt(index.replace("m", ""));
}catch(NumberFormatException nfe){
Log.e(TAG, nfe.getMessage());
}
return myIndex;
}