11

我正在为 Android 制作一个带有谷歌地图的应用程序。我的屏幕上有很多标记,我正在为每个标记准备可定制的气球,当它们被点击时。这意味着,根据点击的标记,我有不同的信息。

我使用 setInfoWindowAdapter 设置标记视图的内容,然后重写方法 getInfoContents。

问题是:这个方法是Info Window内容的通用实现,但是每个marker都要显示自己的信息。因此,据我了解,我必须以某种方式在 getInfoContents(Marker marker) 上检测哪些标记已被单击,以便从我的数据结构中加载显示在信息窗口上的必要信息。问题是:如何识别单击的标记“标记”代表什么实体?我的意思是,只有 getInfoContents 上的对象标记被触发以显示信息窗口,我如何检测哪些是要显示的正确信息?我想通过使用 marker.getTitle() 来比较字符串标题,但这迫使我在信息窗口上显示一个标题,这是我不想要的。还有一个marker.getId(),但是这个ID是API生成的,我控制不了

有任何想法吗?

4

5 回答 5

23

回复:

问题是:如何识别单击的标记“标记”代表什么实体?[...] 还有一个 marker.getId(),但是这样的 ID 是由 API 生成的,我无法控制它

你可以控制它。标记由 addMarker() 返回,因此您可以获取其 ID 并存储它。这是代码:

Map <String, Integer> markers = new HashMap<String, Integer>();

...

MarkerOptions mo = new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker))
.position(new LatLng(mLat, mLon))
.flat(true) 
.snippet("Click here for details")
.rotation(0)
.title(title);

将标记添加到地图时,将其 ID 存储在容器中

MyClass myObject = new MyClass(lat, lon); // The class that you are rendering on the map with Markers, for example "Monument"
Marker mkr = map.addMarker(mo);
markers.put(mkr.getId(), myObject.getId()); 

然后当单击标记时,您可以像这样恢复“myObject”的id

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
    public void onInfoWindowClick(Marker marker) {
        int id = markers.get(marker.getId());
        // Now id contains which Monument (or your preferred class) was clicked                         
    }
});
于 2014-02-23T17:02:08.603 回答
4

有一个更好的选择,这就是谷歌的建议:

TagObject与标记相关联的。例如,Object可以包含有关标记所代表内容的数据。这比存储单独的Map<Marker, Object>. 作为另一个示例,您可以关联String与数据集中的 ID 对应的 ID。Google Maps Android API 既不读取也不写入此属性。

资源

所以你可以做这样的事情:

for (ListItem it: mList) {
    Marker mk = mMap.addMarker(new MarkerOptions().position(it.getLatLng()).title(it.getName()).snippet(it.getAddress()));
    mk.setTag(it.getID());
}

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Integer id = (Integer) marker.getTag();
        return false;
    }
});
于 2017-09-20T06:24:45.430 回答
3

设置标题后,您没有义务显示标题,因此您可以使用它,只要您返回一个ViewfromgetInfoContents而不是返回带有标题值setText的任何子视图。View

根据您如何以及是否已经保留对所有标记的引用,还有其他选择,例如,如果您有List<Marker> policeMarkers并且List<Marker> badGuysMarkers可以使用条件if (policeMarkers.contains(marker)) { ... } else { ... }.

您还可以保留 a Map<Marker, YourMarkerRelatedDataModel> allMarkersand doYourMarkerRelatedDataModel model = allMarkers.get(marker);并使用该值来区分。

最后,您可以使用Android Maps Extensions,它添加了 和 之类的功能Marker.setData(Object)Object Marker.getData()以使您的模型靠近您的标记,而不是创建类似Map<Marker, Model>.

于 2013-05-11T12:17:15.547 回答
0

试试这个代码:

@Override
    public void onInfoWindowClick(final Marker marker) 
    {
        // TODO Auto-generated method stub
       if (marker.getTitle().equalsIgnoreCase("Start")) {
        Toast.makeText(showMaps.this, "You have click on start -->",
                Toast.LENGTH_LONG).show();
        Log.e("marker.getPosition()-->", "" + marker.getPosition());
      }
    }
于 2013-05-11T11:50:08.410 回答
-1
  map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                public void onInfoWindowClick(Marker marker) {

                    double lat=marker.getPosition().latitude;
                    double lng=marker.getPosition().longitude;


                }
            });
于 2020-08-09T16:40:34.133 回答