簡體   English   中英

如何知道在 Google Maps v2 for Android 上點擊了哪個標記?

[英]How to know which Marker was clicked on Google Maps v2 for Android?

我正在為 Android 制作一個帶有谷歌地圖的應用程序。 我的屏幕上有很多標記,我正在為每個標記准備可自定義的氣球,當它們被點擊時。 這意味着,根據點擊的標記,我有不同的信息。

我使用 setInfoWindowAdapter 設置標記視圖的內容,然后覆蓋方法 getInfoContents。

問題是:這個方法是Info Window內容的一般實現,但是每個marker都要顯示自己的信息。 因此,據我所知,我必須以某種方式在 getInfoContents(Marker marker) 上檢測哪些標記已被單擊,以便從我的數據結構加載必要的信息以顯示在信息窗口上。 問題是:我如何識別點擊的標記“標記”代表什么實體? 我的意思是,只有 getInfoContents 上的對象 Marker 被觸發以顯示信息窗口,我如何檢測要顯示的正確信息? 我想通過使用marker.getTitle() 來比較字符串Title,但這迫使我在信息窗口上顯示一個標題,這是我不想要的。 還有一個marker.getId(),但是這個ID是API生成的,我控制不了

有任何想法嗎?

回復:

問題是:我如何識別點擊的標記“標記”代表什么實體? [...] 還有一個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                         
    }
});

有一個更好的選擇,這就是谷歌建議的:

標簽:與標記關聯的Object 例如, 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;
    }
});

您沒有義務顯示標題,當你有它設置,使您可以根據返回使用,並且只要ViewgetInfoContents ,而不是setText對返回的任何子視圖View與標題值。

根據您是否以及是否已經保留對所有標記的引用,還有其他選擇,例如,如果您有List<Marker> policeMarkersList<Marker> badGuysMarkers您可以使用條件if (policeMarkers.contains(marker)) { ... } else { ... }

您還可以保留Map<Marker, YourMarkerRelatedDataModel> allMarkers並執行YourMarkerRelatedDataModel model = allMarkers.get(marker); 並使用該值進行區分。

最后,您可以使用Android Maps Extensions ,它添加了諸如Marker.setData(Object)Object Marker.getData()類的函數,以使您的模型靠近標記,而不是創建諸如Map<Marker, Model>

試試這個代碼:

@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());
      }
    }
  map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                public void onInfoWindowClick(Marker marker) {

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


                }
            });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM