Maps API v2 avec marqueur différent actions
J'essaie de port ma candidature pour le nouveau Google Maps API v2, mais je vais avoir des problèmes lors de l'interaction avec des marqueurs.
Mon contexte: j'ai une carte montrant les bus et les bus s'arrêtent. Avec l'ancienne bibliothèque, j'ai eu mon propre ItemizedOverlay pour les arrêts de bus et un autre pour les bus. Chacun a eu un autre OnTapListener (en fait je utiliser une bibliothèque externe pour afficher les bulles), de sorte que lorsque l'utilisateur appuie sur le bus marqueur rien ne se passe, mais quand il appuie sur l'arrêt de bus le marqueur d'une activité avec son information est ouvert. Aussi, dans ma ItemizedOverlay je l'ai associé chaque marqueur avec son arrêt de bus de l'objet du modèle.
Maintenant, avec la nouvelle API, j'ai 2 problèmes principaux:
- Vous définissez un écouteur avec setOnInfoWindowClickListener() ou setOnMarkerClickListener() les méthodes de votre GoogleMap objet. En d'autres termes, vous ne pouvez définir un écouteur pour l'ensemble des cartes, donc je ne peux pas différencier entre les entailles sur les arrêts de bus ou bus.
- La méthode onClick de deux marqueurs de recevoir uniquement l'objet de Marqueur, d'où je ne peux pas obtenir trop d'informations, comme l'arrêt de bus numéro pour ouvrir son activité (et j'espère qu'il ya une meilleure façon que l'analyse de la Chaîne de titre! O_O)
Je pense que ces deux problèmes pourraient être résolus à l'aide de différents subclases de Marqueur, mais il n'a pas de constructeur et vous obtenez un son de référence lors de l'ajout à la carte, donc je ne sais pas si il est possible d'utiliser une implémentation personnalisée.
L'API est tellement nouveau qu'il n'y a pas beaucoup d'information sur le web au sujet des problèmes similaires. J'ai été à essayer de comprendre comment résoudre ce problème, mais je n'ai rien eu. Quelqu'un sait-il une solution à cela?
Grâce.
EDIT: UNE capture d'écran de mon application actuelle de la carte avec deux types de marqueurs:
- Y penser à deux fois... le Marqueur de classe est finale, donc pas moyen d'utiliser subclases 🙁
- C'est exactement la chose que je suis resté bloqué sur trop! J'étais sur le point de poser la question à moi-même, mais vous avez été plus rapide. Comment devrions-nous nous passer des données à l'marqueurs?
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré ce problème ainsi.
Ma solution a été:
et puis dans le OnMarkerClickListener rappel, tirez votre modèle de la table de hachage à l'aide de l'cliqué sur le marqueur.
Il y a aussi une méthode de Marqueur.getId() qui retourne une chaîne de caractères. Je ne comprends pas pourquoi vous ne pouvez pas spécifier un int id lorsque vous faites le marqueur, ou pourquoi vous ne pouvez pas accéder à l'objet de marqueur avant de l'ajouter à la carte.
Mise à JOUR: Après presque 4 ans Google a ajouté une méthode
Marker.setTag(Object tag)
d'associer des données arbitraires avec un marqueur.getId
developers.google.com/maps/documentation/android/reference/com/... . La carte et les Marqueurs peuvent être restaurés à partir deandroid.os.Bundle
et si oui, alors les marqueurs de la cartemarkerMap
ne sont plus valables ?setTag()
méthode.Ok, voici une solution que j'ai décidé d'utiliser et autant que je sache devrait fonctionner pour toutes les situations:
Vous pouvez utiliser le marqueur de
getId
méthodeVous pouvez utiliser le HashMarker comme ça. Dans cet exemple y points de charge dans le liste de tableaux et de chacun des points de cointaints une nouvelle liste de tableaux avec des coordonnées. Et l'idée est que vous obtenez de point ID.
Créer une table de hachage
Marqueurs = new HashMap();
Puis vous créez un Marqueur et les ajouter à la carte
final Marqueur marqueur = map.addMarker(nouveau MarkerOptions().poste(nouveau LatLng(coordonnées.get(j).getLat(),coordonnées.get(j).getLon())).titre(point de.getName()));
Ensuite, vous pouvez enregistrer l'id de point de valeur du marqueur
Marqueurs.mettre(marqueur, point.getId());
Et finale, vous pouvez obtenir la valeur de l'id lorsque vous cliquez sur la bulle informative
public void onInfoWindowClick(Marqueur marqueur) {
OU
Lorsque vous cliquez sur le marqueur
public boolean onMarkerClick(Marqueur arg0) {