2013-01-16 11 views
31

Bene, ogni indicatore della mia applicazione rappresenterà un utente, quindi devo identificarlo quando faccio clic sulla finestra informativa per ottenere i suoi dati da Internet, e posso Fallo identificare per nome per ovvi motivi. È possibile aggiungere un attributo extra a un oggetto marcatore? Grazie!Aggiungi identificazione al marker su google maps v2 api per android

+0

come hai aggiunto i marcatori? come sovrapposizione? –

+0

È possibile utilizzare il campo snippet della classe Marker. –

+0

Ho un sottotitolo nel campo snippet, quindi non è un'opzione. Cosa intendi come sovrapposizione? Li aggiungo con map.addMarker (... – vdrg

risposta

8

È possibile aggiungere un attributo extra a un oggetto marcatore?

No. Marker è final. Inoltre, gli oggetti Marker che crei scompaiono rapidamente, poiché vengono utilizzati solo per alcuni IPC sull'app Google Play Services. L'oggetto Marker che si ottiene nel numero OnInfoWindowClickListener sembra essere una copia ricostituita.

Ho un sottotitolo nel campo snippet, quindi non è un'opzione.

Certo che lo è. Salva il sottotitolo da qualche altra parte e inserisci la tua chiave nel sottotitolo dell'utente. Quando esegui il rendering di InfoWindow dal tuo InfoWindowAdapter, inserisci il sottotitolo.

2

Ecco una soluzione leggermente più semplice che ho implementato. Tutto quello che devi fare è Creare un InfoWindowAdapter che prende qualcosa che vuoi passare alla finestra nel suo costruttore.

class CustomWindowAdapter implements InfoWindowAdapter{ 
LayoutInflater mInflater; 
private HashMap<Marker, Double> mRatingHash; 

public CustomWindowAdapter(LayoutInflater i, HashMap<Marker, Double> h){ 
    mInflater = i; 
    mRatingHash = h; 
} 

@Override 
public View getInfoContents(Marker marker) { 
    // Getting view from the layout file 
    View v = mInflater.inflate(R.layout.custom_info_window, null); 

    TextView title = (TextView) v.findViewById(R.id.tv_info_window_title); 
    title.setText(marker.getTitle()); 

    TextView description = (TextView) v.findViewById(R.id.tv_info_window_description); 
    description.setText(marker.getSnippet()); 

    RatingBar rating = (RatingBar) v.findViewById(R.id.rv_info_window); 
    Double ratingValue = mRatingHash.get(marker); 
    rating.setRating(ratingValue.floatValue()); 
    return v; 
} 

@Override 
public View getInfoWindow(Marker marker) { 
    // TODO Auto-generated method stub 
    return null; 
} 
} 

Si sono responsabili per qualsiasi dati che si desidera passare alla finestra di informazioni, ma si può vedere qui che sto passando un hash di rating. Solo un prototipo e non è assolutamente la soluzione migliore ma questo dovrebbe far iniziare chiunque.

+0

Salvato il mio giorno .. grazie amico – Noman

5

Non penso che sia una buona idea mantenere forti riferimenti ai marcatori tramite una mappa. Poiché comunque tu usi il tuo adattatore per finestra personalizzato per eseguire il rendering dei contenuti, potresti "abusare" dello snippet() o title() su MarkerOptions per memorizzare le tue informazioni. Sono entrambe stringhe, quindi dipendevano dall'informazione per archiviare un po 'di memoria, dall'altra parte si sarebbe al sicuro da perdite di memoria mantenendo forti riferimenti ai marcatori.

Inoltre, si diventa compatibili con il modo in cui Maps gestisce la persistenza durante gli arresti e riprende.

0

Sto utilizzando una classe aggiuntiva per associare alcune informazioni e funzioni a ogni indicatore. Non penso che questo sia l'approccio migliore, ma è un'opzione. Soprattutto se si desidera avere più della semplice informazione associata a ciascun indicatore di mappa. Ecco la struttura di base che uso per questo.

// Make an array list of for all of your things 
ArrayList<Thing> things; 

class Thing { 
    long thing_key; 
    String thing_string; 
    int thingRadius; 
    Double coord_long; 
    Double coord_lat; 
    Marker marker; 
} 

// Then to use this to start your list. 
things = new ArrayList<>(); 

// Create the thing object and save all the data 
thing = new Thing(); 
thing.marker = thingMarker; 
thing.thing_key = thing_key; 
thing.thing_string = thing_string; 
thing.radius = Integer.getInteger(thingRadius.getText().toString()); 

// Save the thing to the thing ArrayList 
things.add(thing); 
Problemi correlati