【问题标题】:android googleMaps v2 onMarkerclick comparisonandroid googleMaps v2 onMarkerclick 对比
【发布时间】:2013-03-22 18:15:02
【问题描述】:

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

标签类的构造函数:

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 语句任何想法?

【问题讨论】:

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


    【解决方案1】:

    我找到了我正在寻找的文档,不知道我是怎么错过的。

    正如我所读到的,您无法使用“==”比较标记,但您可以使用

    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

    【讨论】:

    • 您可能还希望使用 Map 而不是 List 并进行一些优化,而不是遍历所有标签,而是让您的标签进入 onMarkerClick:Tag tag = map.get(marker)。这也在内部使用 equals。
    • 我从来没有听说过这样的地图,它会让我的生活变得更轻松哈哈
    【解决方案2】:

    您的代码中不需要 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();
            }
    

    【讨论】:

    • 我很乐意,但我得到了错误:Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted. 我正在尝试使其尽可能向后兼容。
    • 啊,是的,那是一个字符串。您必须用 if/then 语句替换。我不相信 android 使用 Java 7(它支持字符串上的 switch 语句)。仅供参考,您将不得不使用 marker.getId().contentsEqual(1)) 而不是 "=="
    【解决方案3】:

    从所选答案扩展 @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 );
    }
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-12-15
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2013-04-15
        相关资源
        最近更新 更多