2013-05-11 18 views
9

Składam aplikację z Mapami Google na Androida. Mam mnóstwo znaczników na moim ekranie i przygotowuję dostosowywalny dymek dla każdego znacznika po ich kliknięciu. Oznacza to, że mam informacje, które różnią się w zależności od znacznika, który został kliknięty.Jak sprawdzić, który znacznik został kliknięty w Google Maps v2 na Androida?

Ustawiam zawartość widoku znacznika za pomocą setInfoWindowAdapter, a następnie nadpisuję metodę getInfoContents.

Problem polega na tym, że ta metoda jest ogólną implementacją zawartości okna informacyjnego, ale każdy znacznik powinien pokazywać własne informacje. Tak więc, o ile rozumiem, muszę jakoś wykryć w getInfoContents (znacznik znacznika), który ze znaczników został kliknięty, w celu załadowania z moich struktur danych niezbędnych informacji do przedstawienia w oknie informacyjnym. Pytanie brzmi: Jak zidentyfikować encję znacznika kliknięcia "znacznik"? Mam na myśli, mając tylko obiekt Marker na getInfoContents, który został wywołany, aby wyświetlić okno informacyjne, w jaki sposób mogę wykryć, które informacje są prawidłowe do wyświetlenia? Myślę jednak o porównaniu tytułu napisowego za pomocą znacznika marker.getTitle(), ale to zobowiązuje mnie do wyświetlenia tytułu w oknie informacyjnym, którego nie chcę. Istnieje również marker.getId(), ale taki identyfikator jest generowany przez interfejs API i nie mogę go kontrolować.

Jakieś pomysły?

Odpowiedz

0

wypróbować ten kod:

@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

nie jesteś zobowiązany pokazać tytuł kiedy masz to ustawione, więc można używać, i tak długo, jak zwrócić View z getInfoContents i nie setText na dowolnym podrzędny z która zwróciła View z wartością tytułu.

W zależności od tego, w jaki sposób i czy już posiadasz odniesienia do wszystkich znaczników, istnieją alternatywy, np. jeśli masz List<Marker> policeMarkers i List<Marker> badGuysMarkers, możesz użyć warunkowego if (policeMarkers.contains(marker)) { ... } else { ... }.

Możesz także zachować Map<Marker, YourMarkerRelatedDataModel> allMarkers i wykonaći użyć tej wartości do rozróżnienia.

Wreszcie można użyć Android Maps Extensions, który dodaje funkcje jak Marker.setData(Object) i Object Marker.getData() zachować swój model blisko swoich markerów i nie tworzyć rzeczy jak Map<Marker, Model>.

18

W odpowiedzi na:

pytanie brzmi: Jak mogę określić, jakie jednostka reprezentuje kliknięciu marker marker „”? [...] Jest również marker.getId(), ale taki identyfikator jest generowany przez API i nie mogę kontrolować to

Można go kontrolować. Znacznik jest zwracany przez addMarker(), dzięki czemu można uzyskać jego identyfikator i zapisać go. Oto kod:

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); 

Podczas dodawania znacznika na mapie, należy przechowywać swój identyfikator na pojemniku

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

Potem, gdy znacznik zostanie kliknięty, można odzyskać id „myObject” tak

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

To działa w moim przypadku .. +1 – Pihu

0

jest lepszym rozwiązaniem, a to, co Google proponuje:

Tag: Object związany z markerem. Na przykład Object może zawierać dane o tym, co reprezentuje znacznik. Jest to łatwiejsze niż przechowywanie oddzielnego Map<Marker, Object>. Jako inny przykład można powiązać identyfikator String odpowiadający identyfikatorowi ze zbioru danych. Google Maps Android API nie odczytuje ani nie zapisuje tej właściwości.

Source

Więc można zrobić coś takiego:

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; 
    } 
}); 
Powiązane problemy