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.
- Google Maps v2 que centra y que da vuelta a la posición de la cámara para caber dos marcadores
- Cómo obtener coordenadas de pantalla de marcador en google maps v2 android
- Google Maps API v2 Android agregar forma drawable como marcador
- Cómo mostrar el marcador de posición actual en el mapa en android?
- Google Maps Android API v2 detecta un clic largo en el mapa y agrega marcador que no funciona
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:
- Google android maps api v2 Mostrar el título del marcador Siempre
- Mover marcador en google maps api 2
- Referencia de mapa de bits desconocida publicada
- Los marcadores se mueven al realizar el zoom con Google Maps Android API v2
- Strange ArrayIndexOutOfBoundsException en algunos dispositivos al dibujar polilíneas
- Actualizar continuamente el marcador cuando cambia la ubicación en Android
- Cómo deshabilitar evento de clic de marcador?
- Localización en tiempo real del dispositivo android desde otro dispositivo
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; }