我正在构建一个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.
}
答案 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个标记。我不知道这有多大可能,这将是一个值得研究/测试的东西。