如何将对象与Google地图标记相关联?

时间:2013-03-13 15:37:21

标签: android object location google-maps-markers google-maps-android-api-2

我正在构建一个Android GPS应用程序,根据用户当前位置显示最近的位置。我正在使用MapFragment,我在AsyncTask中将标记放在地图上,如下所示:

protected void onPostExecute(Void result) { 
    super.onPostExecute(result);

    for(int i = 0; i < list.size(); i++)
    {
        HashMap<String,String> location = new HashMap<String,String>();
        location = list.get(i);

        String type = location.get("type");
        int marker = getTypeDrawable(type);

        LatLng position = new LatLng(Float.parseFloat(location.get("lat")), Float.parseFloat(location.get("long")));
         map.addMarker(new MarkerOptions()
        .position(position)
        .title(location.get("name"))
        .snippet(location.get("distance") + location.get("type"))                                  
        .icon(BitmapDescriptorFactory.fromResource(marker)));
        System.out.println(list.get(i));
    }

    Toast.makeText(MainActivity.this, "Finished retrieving nearby locations",
            Toast.LENGTH_SHORT).show();         
}

这是我的全局变量列表,其中包含最近的locatoins的所有信息:ArrayList<HashMap<String, String>> list;

我的计划是在点击标记时显示弹出对话框,就像地理缓存应用程序“C:Geo”一样。我的问题是,我不知道如何在对话框中显示该标记的信息。如您所见,我使用的是map.addMarker()方法,但我无法将该位置与该标记相关联。

我希望像这样制作一个弹出式对话框:

@Override
public boolean onMarkerClick(Marker marker) {
 //Get location associated with marker. 
//Fill popup dialog with information associated 
//with location and then invoke the dialog.
}

3 个答案:

答案 0 :(得分:1)

您需要选择能够唯一标识标记和位置的内容。也许这是你在标记上设置的标题(你的位置会有一些相应的字符串)或者Lat / Lng组合。当用户点击标记时,您将在onMarkerClick(Marker marker)方法中收到该标记,从标记中读取标题或lat / lng,并从您的位置查找相应的位置。例如,您可以遍历您的HashMap位置并检查该位置是否与您的标记具有相同的纬度/经度,然后您将获得与您的标记相对应的位置。

肯定有更有效的方法,但你明白了。

答案 1 :(得分:0)

你走在正确的轨道上。有关如何使用HashMap将对象链接到标记的离散示例,请参阅my answer here

答案 2 :(得分:0)

考虑到所需方法的格式,我认为您可以使用标记的哈希码作为访问位置的密钥。我自己没有尝试过,但我的以下想法应该有效(并且效率更高)。 首先,您必须将添加标记的方式更改为:

Marker locationMarker = map.addMarker(new MarkerOptions()
    .position(position)
    .title(location.get("name"))
    .snippet(location.get("distance") + location.get("type"))                                  
    .icon(BitmapDescriptorFactory.fromResource(marker)));

这可确保您可以访问添加的标记对象。然后,将HashMap作为关键字Integer,将Location作为结果对象。使用标记的哈希码的密钥存储位置,您可以使用以下代码访问该代码:marker.hashCode();

我通常使用getTag() / setTag()方法来保存对象引用,但不幸的是Marker类没有标记:(

这种方式的一个可能的警告是,MAYBE hashCode将碰撞2个标记。我不知道这有多大可能,这将是一个值得研究/测试的东西。