我的谷歌地图上有一个onMarkerClickListener,它会在按下标记时触发。
标记在Tag类中创建,该类在传递的地图上自己创建标记:
地图活动开始时列表的实例:
//tags
List<Tag> tags = new ArrayList<Tag>();
在包含googleMap的活动的onCreate()中,我将标记添加到列表中:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....other code here
//add the markers to the map
tags.add(new Tag(map,1,"City Of Dundee", "Home Of The Jakey", DUNDEE, this.getResources(),R.drawable.ic_launcher));
tags.add(new Tag(map,2,"Some Place","This is some place",LOCATION_Z,this.getResources(),R.drawable.ic_launcher));
....other code here
}//end on create
Tag类的构造函数:
public Tag(GoogleMap map, int atagID,String tagTitle, String tagSnippet, LatLng tagPosition, Resources resource, int id){
this.tagID = atagID;
this.position = tagPosition;
this.title = tagTitle;
this.snippet = tagSnippet;
this.icon = BitmapDescriptorFactory.fromResource(id);
this.theTag = map.addMarker(new MarkerOptions()
.position(tagPosition)
.title(tagTitle)
.snippet(tagSnippet)
.icon(icon));
}
这会创建标记,并在地图上正确显示
在onMarkerClickedListener的监听器中,我将点击地图上的标记与列表中的标记进行比较,但if语句永远不会通过,即使我比较相同的标题。
听众:
onMarkerClickListener = new OnMarkerClickListener(){
@Override
public boolean onMarkerClick(Marker marker) {
//for loop that goes over array or marker
//if marker is equal to mark in array
//do marker functionality
for(Tag currentTag : tags){
if(currentTag.theTag == marker){
switch(currentTag.tagID){
case 1:
//do something for that button
Toast.makeText(getApplicationContext(), "marker 1", Toast.LENGTH_SHORT).show();
return true;
case 2:
Toast.makeText(getApplicationContext(), "marker 2", Toast.LENGTH_SHORT).show();
return false;
default:
Toast.makeText(getApplicationContext(), "default", Toast.LENGTH_SHORT).show();
return false;
}
}else{
Toast.makeText(getApplicationContext(), "theTag " + currentTag.tagID + ": " + currentTag.theTag.getTitle(), Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "marker: " + marker.getTitle(), Toast.LENGTH_SHORT).show();
}
}
return false;
}
};
我不知道为什么它从未达到任何想法的开关声明?
答案 0 :(得分:2)
我找到了我要找的文件,不知道我是怎么想的。
正如我所读到的,您无法使用'=='来比较标记,但您可以使用
if(markerA.equals(markerB)
{
}
像这样:
if(theTag.equals(marker){
//it will compare properly this way instead of returning false every time
}
网站参考: https://developers.google.com/maps/documentation/android/marker
答案 1 :(得分:1)
您的代码中不需要for循环。当您对标记执行相等性测试时(使用==),它将返回false,并且永远不会到达您的开关。相反,尝试删除for循环而只是我们。
switch(marker.getId()){
case 1:
//do something for that button
Toast.makeText(getApplicationContext(), "marker 1", Toast.LENGTH_SHORT).show();
return true;
case 2:
Toast.makeText(getApplicationContext(), "marker 2", Toast.LENGTH_SHORT).show();
return false;
default:
Toast.makeText(getApplicationContext(), "default", Toast.LENGTH_SHORT).show();
return false;
}
}else{
Toast.makeText(getApplicationContext(), "theTag " + currentTag.tagID + ": " + currentTag.theTag.getTitle(), Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "marker: " + marker.getTitle(), Toast.LENGTH_SHORT).show();
}
答案 2 :(得分:0)
根据所选答案扩展@MaciejGórski评论我建议使用标记的ID(奇怪的是字符串)。
这可以帮助您避免对标记本身引用GoogleMap
对象,以及整个MapView
/ MapFragment
/ SupportMapFragment
在我的班上,我有:
private Map< String, MyObject > markersMap = new HashMap< String, MyObject >();
然后当我创建标记时,我将它们添加到地图中:
markersMap.put( marker.getId(), myObj );
然后在听众中我能够像这样检索myObj
@Override
public void onInfoWindowClick( Marker m )
{
Log.v( TAG, "onInfoWindowClick m.getId = " + m.getId() );
MyObject myObj = markersMap.get( m.getId() );
Log.v( TAG, "onInfoWindowClick myObj = " + myObj );
}
这样我就可以避免泄漏视图/活动/地图等
答案 3 :(得分:0)
==运算符将比较两个对象(不同的,因为是不同的实例)的内存方向,而不是对象属性。 等于方法,将比较对象属性的值,或者如果你覆盖等于你可以比较你想要的,这将更适合你。