0

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

我不知道为什么它从来没有达到 switch 语句的任何想法?

4

4 回答 4

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

于 2013-04-01T17:28:08.517 回答
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();
        }
于 2013-04-01T16:43:56.570 回答
0

从所选答案扩展@MaciejGórski 评论我建议使用标记的ID(奇怪的是一个字符串)。

这可以帮助您避免保留对本身具有对象引用的标记的硬引用,从而避免GoogleMap整个MapView//MapFragmentSupportMapFragment

在我的课堂上,我有:

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 );
}

这样我可以避免泄漏视图/活动/地图等

于 2013-08-05T21:29:47.167 回答
0

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

于 2016-04-27T13:57:48.163 回答