Google Maps API v2 con diferentes acciones de marcador

Estoy intentando portar mi aplicación a la nueva API de Google Maps v2, pero estoy teniendo problemas al interactuar con marcadores.

Mi contexto: Tengo un mapa que muestra los autobuses y los autobuses de parada. Con la biblioteca vieja tenía mi propio ItemizedOverlay para paradas de autobús y otro para los autobuses. Cada uno tenía un OnTapListener diferente (en realidad uso una biblioteca externa para mostrar globos), así que cuando el usuario toca el marcador de bus no pasa nada, pero cuando se golpea el marcador de parada de autobús se abre una actividad con su información. Además, en mi ItemizedOverlay mapeé cada marcador con su objeto de parada de bus del modelo.

Ahora con la nueva API tengo dos problemas principales:

  • Establece un listener con los métodos setOnInfoWindowClickListener () o setOnMarkerClickListener () de su objeto GoogleMap. En otras palabras, sólo se puede establecer un oyente para todos los mapas, por lo que no puedo diferenciar entre taps en paradas de autobús o autobuses.
  • El método onClick de ambos marcadores sólo recibe el objeto Marcador, desde donde no puedo obtener demasiada información como el número de parada de autobús para abrir su actividad (y espero que haya una mejor manera de analizar el título String! O_O)

Creo que estos dos problemas podrían ser resueltos utilizando diferentes subclases de Marker, pero no tiene constructor y obtiene su referencia al añadirlo al mapa, por lo que no sé si es posible utilizar una implementación personalizada.

El API es nuevo por lo que no hay mucha información en la web sobre problemas similares. He estado tratando de averiguar cómo resolver esto, pero no tengo nada. ¿Alguien sabe una posible solución a esto?

Gracias.

EDIT: Una captura de pantalla del mapa de mi aplicación actual con dos tipos de marcadores: Una captura de pantalla del mapa de mi aplicación actual con dos tipos de marcador

También he encontrado este problema. Mi solución fue:

private Map<Marker, MyModel> markerMap = new HashMap<>(); private GoogleMap mMap; private void doMarkers(){ MarkerOptions opt = new MarkerOptions(); //Fill out opt from MyModel Marker marker = mMap.addMarker(opt); markerMap.put(marker, myModel); } 

Y luego en la devolución de llamada OnMarkerClickListener, extraiga su modelo de HashMap utilizando el marcador pulsado. También hay un método Marker.getId () que por alguna razón devuelve una cadena. No entiendo por qué no se puede especificar un identificador int cuando se hace el marcador o por qué no se puede acceder al objeto marcador antes de agregarlo al mapa.

ACTUALIZACIÓN: Después de casi 4 años Google ha añadido un método Marker.setTag(Object tag) para asociar datos arbitrarios con un marcador.

Ok aquí es una solución que he decidido utilizar y AFAIK debe funcionar para cualquier situación:

 private HashMap<String, MyModel> markers= new HashMap<String, MyModel>(); MyModel item = ... MarkerOptions markerOptions = ... markers.put(mMap.addMarker(markerOptions).getId(), item); @Override public void onInfoWindowClick(Marker marker) { MyModel mapItem = (MyModel) markers.get(marker.getId());. ... } 

Puede utilizar el método getId del marcador

Puedes usar el HashMarker de esa manera. En este ejemplo, los puntos de carga en Arraylist y cada punto cointaints una nueva ArrayList con coordenadas. Y la idea es que usted obtenga el ID de punto.

Crear un HashMap

Marcadores = new HashMap ();

A continuación, crea un Marcador y agrega al mapa

Final (marcador) Marcador = map.addMarker (nueva posición MarkerOptions ()) (nuevo LatLng (coordenadas.get (j) .getLat (), coordenadas.get (j) .getLon ())) title (point.getName) );

Entonces usted puede ahorrar la identificación del punto con el valor del marcador

Markers.put (marcador, punto.getId ());

Y final, puedes obtener el valor de id cuando haces clic en InfoWindow

Public void onInfoWindowClick (Marcador) {

  final long id = Marcadores.get(marker); Log.e("Real Marker ID", id+""); } 

O

Al hacer clic en el marcador

Public boolean onMarkerClick (Marcador arg0) {

  final long id = Marcadores.get(marker); Log.e("Real Marker ID", id+""); return false; } 
  • Marcadores de mapa con texto en Google Maps Android API v2
  • Mueva la posición de la cámara para ajustar LatLngBounds con respecto a la altura del marcador
  • Escribir texto en el marcador personalizado Google Map v2 - Android
  • ¿Cómo activar el evento onClick de un marcador en un Google Maps V2 para Android?
  • Google Maps de Google - marcador marcado abre una nueva actividad o una ventana más grande
  • No se puede obtener GoogleMap OnMarkerClickListener para trabajar
  • Eliminar marcador anterior y agregar nuevo marcador en Google Map v2
  • Android Google map Excepción de puntero nulo al agregar marcador
  • Marcador personalizado en google maps en android con vector icono de activo
  • Cómo crear un marcador de mapa de bits personalizado con Android mapa API v2
  • Hacer que el marcador se pueda arrastrar tras un solo clic en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.