web-dev-qa-db-fra.com

Ajouter une identification au marqueur sur l'api google maps v2 pour android

Eh bien, chaque marqueur de mon application représentera un utilisateur, donc je dois l'identifier lorsque je clique sur la fenêtre d'informations pour obtenir ses données sur Internet, et je ne peux pas le faire l'identifier par son nom pour des raisons évidentes. Est-il possible d'ajouter un attribut supplémentaire à un objet marqueur? Merci!

31
vdrg

Vous pourriez faire un HashMap<Marker, User>

consultez ce tutoriel: http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html

38
dumazy

Est-il possible d'ajouter un attribut supplémentaire à un objet marqueur?

Non. Marker est final. De plus, les objets Marker que vous créez disparaissent rapidement, car ils ne sont utilisés que pour certains IPC vers l'application Google Play Services. L'objet Marker que vous obtenez dans votre OnInfoWindowClickListener semble être une copie reconstituée.

J'ai un sous-titre dans le champ d'extrait de code, ce n'est donc pas une option.

Bien sûr que ça l'est. Stockez le sous-titre ailleurs et mettez votre clé à votre utilisateur dans le sous-titre. Lorsque vous rendez le InfoWindow à partir de votre InfoWindowAdapter, insérez le sous-titre.

8
CommonsWare

Je ne pense pas que ce soit une bonne idée de conserver des références fortes aux marqueurs via une carte. Comme vous utilisez de toute façon votre adaptateur de fenêtre personnalisé pour afficher le contenu, vous pouvez soit "abuser" de l'extrait () ou du titre () sur les options de marqueur pour stocker vos informations. Ce sont deux chaînes, donc en fonction des informations à stocker, vous utiliseriez légèrement plus de mémoire, de l'autre côté, vous seriez à l'abri des fuites de mémoire en conservant des références fortes aux marqueurs.

vous deviendriez également compatible avec la façon dont Maps gère la persistance lors des arrêts et des reprises.

5
comeGetSome

Voici une solution légèrement plus simple que j'ai mise en œuvre. Tout ce que vous faites est de créer un InfoWindowAdapter qui prend quelque chose que vous souhaitez passer à la fenêtre dans son constructeur.

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

Vous êtes responsable de toutes les données que vous souhaitez transmettre à la fenêtre d'informations, mais vous pouvez voir ici que je passe un hachage de notes. Ce n'est qu'un prototype et ce n'est en aucun cas la meilleure solution, mais cela devrait faire démarrer tout le monde.

2
wapples

J'utilise une classe supplémentaire pour associer certaines informations et fonctions à chaque marqueur. Je ne pense pas que ce soit la meilleure approche, mais c'est une option. Surtout si vous souhaitez avoir plus que des informations associées à chaque marqueur de carte. Voici la structure de base que j'utilise pour cela.

//   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);
0
AlbertMarkovski