Comment savoir quel marqueur a été cliqué sur Google Maps v2 pour Android?

Je crée une application avec Google Maps, pour Android. J’ai beaucoup de marqueurs sur mon écran et je prépare un ballon personnalisable pour chaque marqueur lorsque vous cliquez dessus. Cela signifie que j’ai des informations différentes selon le marqueur sur lequel vous avez cliqué.

J’ai configuré le contenu de la vue du marqueur avec setInfoWindowAdapter, puis j’ai redéfini la méthode getInfoContents.

Le problème est le suivant: cette méthode est l’implémentation générale du contenu de la fenêtre d’information, mais chaque marqueur doit afficher ses propres informations. Donc, autant que je sache, je dois d’une manière ou d’une autre détecter sur getInfoContents (marqueur de marqueur) les marqueurs sur lesquels un clic a été effectué, afin de charger de mes structures de données les informations nécessaires à présenter dans la fenêtre d’informations. La question qui se pose est la suivante: comment identifier l’entité représentée par le “marqueur” du marqueur sur lequel on a cliqué? Je veux dire, ayant juste le marqueur d’object sur getInfoContents qui a été déclenché pour afficher la fenêtre d’information, comment puis-je détecter quelle est la bonne information à afficher? Je pensais comparer le titre de la chaîne à l’aide de marker.getTitle (), mais cela m’oblige à afficher un titre dans la fenêtre d’information, ce que je ne souhaite pas. Il y a aussi un marker.getId (), mais un tel identifiant est généré par l’API et je ne peux pas le contrôler.

Des idées?

En réponse à:

La question qui se pose est la suivante: comment identifier l’entité représentée par le “marqueur” du marqueur sur lequel on a cliqué? […] Il y a aussi un marker.getId (), mais un tel identifiant est généré par l’API et je ne peux pas le contrôler

Vous pouvez le contrôler. Le marqueur est renvoyé par addMarker (), vous pouvez donc obtenir son ID et le stocker. Voici le code:

Map  mMarkers = new HashMap(); 

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

Lorsque vous ajoutez le marqueur à la carte, stockez son ID sur le conteneur.

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

Ensuite, lorsque le marqueur est cliqué, vous pouvez récupérer l’identifiant de “myObject” comme ceci

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

Vous n’êtes pas obligé d’afficher le titre lorsque vous l’avez défini. Vous pouvez donc l’utiliser et tant que vous retournez une View partir de getInfoContents et non pas setText sur une sous-vue de cette View renvoyée avec une valeur de titre.

Selon comment et si vous conservez déjà des références à tous les marqueurs, il existe des alternatives. Par exemple, si vous aviez List policeMarkers et List badGuysMarkers vous pouvez utiliser une condition if (policeMarkers.contains(marker)) { ... } else { ... } .

Vous pouvez également conserver un Map allMarkers et effectuer YourMarkerRelatedDataModel model = allMarkers.get(marker); et utiliser cette valeur pour différencier.

Enfin, vous pouvez utiliser Android Maps Extensions , qui ajoute des fonctions telles que Marker.setData(Object) et Object Marker.getData() pour que votre modèle rest proche de vos marqueurs et ne crée pas d’éléments tels que Map .

Il y a une meilleure option, et voici ce que Google suggère:

Tag : un Object associé au marqueur. Par exemple, l’ Object peut contenir des données sur ce que représente le marqueur. Cela est plus facile que de stocker une Map distincte Map . Comme autre exemple, vous pouvez associer un ID de Ssortingng correspondant à l’ID d’un dataset. L’API Android de Google Maps ne lit ni n’écrit cette propriété.

La source

Donc, vous pouvez faire quelque chose comme ça:

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

essayez ce code:

 @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()); } }