android googleMaps v2 onMarkerclick比较

时间:2013-04-01 16:37:14

标签: android if-statement google-maps-markers google-maps-api-2

我的谷歌地图上有一个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;
    }
};

我不知道为什么它从未达到任何想法的开关声明?

4 个答案:

答案 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)

==运算符将比较两个对象(不同的,因为是不同的实例)的内存方向,而不是对象属性。 等于方法,将比较对象属性的值,或者如果你覆盖等于你可以比较你想要的,这将更适合你。