Google Maps API v2: ¿cómo hacer clic en los marcadores?

¿Cómo puedo hacer que los marcadores en Android Google Maps API v2 se puedan hacer clic para que aparezcan un menú con opciones o simplemente comiencen una nueva actividad? Creo que hice los marcadores en mi aplicación actualmente en un método “nuevo”. No les asigné un nombre o un método para poder vincularlo con el rest del código requerido.

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

Si RESPONDIES esto, incluye un código de muestra de un marcador que se introduce con un nombre único y luego configúralo como seleccionable para abrir una nueva actividad.

Se puede hacer clic en todos los marcadores en Google Android Maps Api v2. No necesita establecer propiedades adicionales para su marcador. Lo que debe hacer es registrar la callback del marcador en su googlemap y manejar el clic dentro de la callback:

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

aquí hay una buena guía en google sobre la personalización de marcadores

setTag(position) al agregar marcador al mapa.

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

getTag() en el oyente 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; } }); 

Evite utilizar Activity implements OnMarkerClickListener, use un OnMarkerClickListener local

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

Necesitará un mapa para buscar el modelo de datos original vinculado al marcador

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

Necesitarás un modelo de datos

 private Map dataModel = new HashMap<>(); 

Pon algunos datos en el modelo de datos

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

Al crear un marcador nuevo usando un modelo de datos, agregue ambos al mapa del fabricante

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

Para un evento de marcador de clic, use 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); String title = (String)dataModel.get("title"); markerOnClick(title); return false; } }); mapView.onResume(); showMarkers(); ZoomAsync zoomAsync = new ZoomAsync(); zoomAsync.execute(); } 

Para mostrar la ventana de información, recupera el modelo de datos original del mapa marcador:

 @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); String title = (String)dataModel.get("title"); infoWindowOnClick(title); } }); 

Otra solución: obtienes el marcador por su título

 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) { String name= marker.getTitle(); if (name.equalsIgnoreCase("My Spot")) { //write your code here } } 

}

Aquí está mi código completo de una actividad de mapa con 4 marcadores seleccionables. Haga clic en un marcador que muestra una ventana de información, y luego de hacer clic en la ventana de información, irá a otra actividad: inglés, alemán, español o italiano. Si desea utilizar OnMarkerClickListener a pesar de OnInfoWindowClickListener, solo tiene que cambiar esta línea:

 mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 

a esto:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 

esta línea:

 public void onInfoWindowClick(Marker arg0) 

a esto:

 public boolean onMarkerClick(Marker arg0) 

y al final del método “onMarkerClick”:

 return true; 

Creo que puede ser útil para alguien;)

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

He editado el ejemplo anterior dado …

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