2013-05-11 83 views
9

我正在製作Android上的Google地圖應用程序。我的屏幕上有很多標記,當他們被點擊時,我正在爲每個標記準備可定製的氣球。這意味着,我有根據點擊標記不同的信息。如何知道在Android版Google地圖v2上點擊了哪個標記?

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

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

任何想法?

回答

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()); 
     } 
    } 
3

您沒有義務,以顯示標題,當你有它設置,這樣你就可以使用,並且只要你對任何子視圖返回從getInfoContents一個View,而不是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>創造的東西。

18

在回答:

的問題是:如何識別什麼實體的點擊標記「標記」代表? [...] 還有是一個marker.getId(),而是由API生成這樣的ID,我無法控制它

您可以控制它。標記由addMarker()返回,所以你可以得到它的ID並存儲它。這裏的代碼:

Map <String, Integer> mMarkers = 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在容器上

Marker mkr = map.addMarker(mo); 
mMarkers.put(mkr.getId(), myObject.getId()); 

然後點擊標記時,就可以恢復「myObject的」的ID,這樣

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 
    public void onInfoWindowClick(Marker marker) { 
     int id = mMarkers.get(marker.getId()); 
     // Do stuff with the id       
    } 
}); 
+0

它工作在我的情況.. +1 – Pihu 2016-06-04 08:43:06

0

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

標籤:與標記相關聯的Object。例如,Object可以包含有關標記所代表的內容的數據。這比存儲單獨的Map<Marker, Object>容易。作爲另一個示例,您可以將與數據集ID相對應的String ID關聯起來。 Google Maps Android API既不讀取也不寫入此屬性。

Source

所以,你可以做這樣的事情:

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; 
    } 
}); 
相關問題