Google Maps API v2: comment rendre les marqueurs cliquables?

Comment puis-je faire en sorte que les marqueurs de l’API Google Maps v2 d’Android deviennent cliquables afin qu’ils ouvrent un menu avec des options ou démarrent une nouvelle activité? Je crois que j’ai fait les marqueurs dans mon application actuellement dans une méthode “newb”. Je ne leur ai pas atsortingbué de nom ou de méthode pour pouvoir le relier au rest du code requirejs.

googleMap.addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 

Si vous répondez à cela, veuillez inclure un exemple de code d’un marqueur introduit avec un nom unique, puis défini comme pouvant être cliqué pour ouvrir une nouvelle activité.

Tous les marqueurs dans Google Android Maps Api v2 sont cliquables. Vous n’avez pas besoin de définir de propriétés supplémentaires pour votre marqueur. Ce que vous devez faire – est d’enregistrer le marqueur cliquez sur le rappel à votre googleMap et manipulez le clic dans le rappel:

 public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity implements OnMarkerClickListener { private Marker myMarker; private void setUpMap() { ....... googleMap.setOnMarkerClickListener(this); myMarker = googleMap.addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); ...... } @Override public boolean onMarkerClick(final Marker marker) { if (marker.equals(myMarker)) { //handle click here } } } 

voici un bon guide sur google à propos de la personnalisation des marqueurs

setTag(position) tout en ajoutant un marqueur à la carte.

 Marker marker = map.addMarker(new MarkerOptions() .position(new LatLng(latitude, longitude))); marker.setTag(position); 

getTag() sur l’écouteur setOnMarkerClickListener

 map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { int position = (int)(marker.getTag()); //Using position get Value from arraylist return false; } }); 

Évitez d’utiliser des implémentations Activity OnMarkerClickListener, utilisez un OnMarkerClickListener local

 // Not a good idea class MapActivity extends Activity implements OnMarkerClickListener { } 

Vous aurez besoin d’une carte pour rechercher le modèle de données d’origine lié au marqueur

 private Map> markers = new HashMap<>(); 

Vous aurez besoin d’un modèle de données

 private Map dataModel = new HashMap<>(); 

Mettre des données dans le modèle de données

 dataModel.put("title", "My Spot"); dataModel.put("snipet", "This is my spot!"); dataModel.put("latitude", 20.0f); dataModel.put("longitude", 100.0f); 

Lors de la création d’un nouveau marqueur à l’aide d’un modèle de données, ajoutez les deux à la carte du fabricant

 Marker marker = googleMap.addMarker(markerOptions); markers.put(marker, dataModel); 

Pour l’événement marqueur de clic, utilisez un OnMarkerClickListener local:

 @Override public void onMapReady(GoogleMap googleMap) { // grab for laters this.googleMap = googleMap; googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Map dataModel = (Map)markers.get(marker); Ssortingng title = (Ssortingng)dataModel.get("title"); markerOnClick(title); return false; } }); mapView.onResume(); showMarkers(); ZoomAsync zoomAsync = new ZoomAsync(); zoomAsync.execute(); } 

Pour afficher la fenêtre d’informations, récupérez le modèle de données d’origine à partir de la carte du marqueur:

 @Override public void onMapReady(GoogleMap googleMap) { this.googleMap = googleMap; googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Map dataModel = (Map)markers.get(marker); Ssortingng title = (Ssortingng)dataModel.get("title"); infoWindowOnClick(title); } }); 

Une autre solution: vous obtenez le marqueur par son titre

 public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity implements OnMarkerClickListener { private Marker myMarker; private void setUpMap() { ....... googleMap.setOnMarkerClickListener(this); myMarker = googleMap.addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); ...... } @Override public boolean onMarkerClick(final Marker marker) { Ssortingng name= marker.getTitle(); if (name.equalsIgnoreCase("My Spot")) { //write your code here } } 

}

Voici mon code entier d’une activité de carte avec 4 marqueurs cliquables. Cliquez sur un marqueur pour afficher une fenêtre d’information et, après avoir cliqué sur la fenêtre d’information, vous accédez à une autre activité: anglais, allemand, espagnol ou italien. Si vous souhaitez utiliser OnMarkerClickListener malgré OnInfoWindowClickListener, il vous suffit de permuter cette ligne:

 mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 

pour ça:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 

cette ligne:

 public void onInfoWindowClick(Marker arg0) 

pour ça:

 public boolean onMarkerClick(Marker arg0) 

et à la fin de la méthode “onMarkerClick”:

 return true; 

Je pense que cela peut être utile pour quelqu’un;)

 package pl.pollub.translator; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show(); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker arg0) { if(arg0 != null && arg0.getTitle().equals("English")){ Intent intent1 = new Intent(MapsActivity.this, English.class); startActivity(intent1);} if(arg0 != null && arg0.getTitle().equals("German")){ Intent intent2 = new Intent(MapsActivity.this, German.class); startActivity(intent2);} if(arg0 != null && arg0.getTitle().equals("Italian")){ Intent intent3 = new Intent(MapsActivity.this, Italian.class); startActivity(intent3);} if(arg0 != null && arg0.getTitle().equals("Spanish")){ Intent intent4 = new Intent(MapsActivity.this, Spanish.class); startActivity(intent4);} } }); LatLng greatBritain = new LatLng(51.30, -0.07); LatLng germany = new LatLng(52.3107, 13.2430); LatLng italy = new LatLng(41.53, 12.29); LatLng spain = new LatLng(40.25, -3.41); mMap.addMarker(new MarkerOptions() .position(greatBritain) .title("English") .snippet("Click on me:)")); mMap.addMarker(new MarkerOptions() .position(germany) .title("German") .snippet("Click on me:)")); mMap.addMarker(new MarkerOptions() .position(italy) .title("Italian") .snippet("Click on me:)")); mMap.addMarker(new MarkerOptions() .position(spain) .title("Spanish") .snippet("Click on me:)")); mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain)); mMap.moveCamera(CameraUpdateFactory.newLatLng(germany)); mMap.moveCamera(CameraUpdateFactory.newLatLng(italy)); mMap.moveCamera(CameraUpdateFactory.newLatLng(spain)); } } 

J’ai édité l’exemple donné ci-dessus …

 public class YourActivity extends implements OnMarkerClickListener { ...... private void setMarker() { ....... googleMap.setOnMarkerClickListener(this); myMarker = googleMap.addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); ...... } @Override public boolean onMarkerClick(Marker marker) { Toast.makeText(this,marker.getTitle(),Toast.LENGTH_LONG).show(); } }