2012-12-27 26 views
27

Nella mia app ho alcuni oggetti che hanno la loro posizione visualizzata sulla mappa usando marcatori. Il problema è che l'unico modo che ho trovato per gestire scatti marcatore èAssociare un oggetto a Marker (google map v2)

googleMap.setOnMarkerClickListener(new ... { 
    @Override 
    public void onMarkerClick(Marker marker) { 
     // how to get the object associated to marker??? 
    } 
}) 

In altre parole ottengo l'oggetto Marker, mentre l'unica interfaccia che ho mi permette di impostare solo MarkerOptions.

Un modo per associare Marcatore a un oggetto?

risposta

24

È possibile associare oggetto arbitrario utilizzando Marker s' setTag() metodo

Marker amarker = mMap.addMarker(new MarkerOptions().position(lat, lng).title("Hello World")); 
amarker.setTag(new SomeData()); 

Per recuperare i dati associati con un pennarello, è sufficiente leggerlo usando la sua getTag() e poi lanci al suo tipo di originale.

SomeData adata = (SomeData) amarker.getTag(); 

More information

+0

Questa è la soluzione corretta. Come da documentazione relativa a Tag in Marker: "Un oggetto associato al marker, ad esempio, l'oggetto può contenere dati su ciò che rappresenta il marker.Questo è più facile che memorizzare una mappa separata ." – JDenais

+0

Soluzione corretta a partire da Play Services 9.4 – hibob

+0

Questa è la soluzione GIUSTA! –

54

Riconosco che questa funzione di callback non è stata eseguita molto bene dal team di Android, ma è ciò che abbiamo.

Ogni volta che si chiama mMap.addMarker(); restituisce il marker generato. È quindi possibile utilizzare una HashMap o un'altra struttura di supporto dei dati per ricordarla.

// Create the hash map on the beginning 
WeakHashMap <Marker, Object> haspMap = new WeakHashMap <Marker, Object>(); 


// whenever adding your marker 
Marker m = mMap.addMarker(new MarkerOptions().position(lat, lng).title("Hello World").icon(icon_bmp)); 
haspMap.put(m, your_data); 
+8

mi raccomando 'WeakHashMap', così quando un' Marker' ottiene garbage collection, così sarà la sua associata 'ingresso WeakHashMap' e' valore Object'. Ma, sì, sfortunatamente questa sembra essere l'unica opzione al momento. – CommonsWare

+1

ha senso per me. Ho modificato la mia risposta per essere WeakHashMap. È ok? – Budius

+0

Sembra giusto. – CommonsWare

8

Un'altra opzione sarebbe quella di creare una mappa le cui chiavi sono marker.getId() e il valore è il nostro oggetto.

In questo modo, non manterremo un riferimento a un marcatore in memoria e non dovremmo preoccuparci dei marcatori raccolti.

Qui è possibile vedere more answers.

Problemi correlati