marcadores - google maps android studio
Maps API v2 con diferentes acciones de marcadores (4)
Me he encontrado con este problema también. 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 de OnMarkerClickListener, saque su modelo del HashMap usando el marcador en el que se hizo clic. También hay un método Marker.getId () que por alguna razón devuelve una cadena. No entiendo por qué no puede especificar un Id. Int cuando crea el marcador, o por qué no puede acceder al objeto marcador antes de agregarlo al mapa.
ACTUALIZACIÓN: Después de casi 4 años, Google ha agregado un método Marker.setTag(Object tag)
para asociar datos arbitrarios con un marcador.
Estoy tratando de trasladar mi aplicación a la nueva API de Google Maps v2, pero tengo problemas al interactuar con los marcadores.
Mi contexto: tengo un mapa que muestra los autobuses y las paradas de autobuses. Con la biblioteca antigua tuve mi propio ItemizedOverlay para paradas de autobús y otra para autobuses. Cada uno tenía un OnTapListener diferente (en realidad uso una biblioteca externa para mostrar globos), de modo que cuando el usuario toca el marcador del bus no pasa nada, pero cuando toca el marcador de parada del autobús, se abre una actividad con su información. Además, en mi ItemizedOverlay asigné cada marcador con su objeto de parada de autobús del modelo.
Ahora con la nueva API tengo 2 problemas principales:
- Establece una escucha con los métodos setOnInfoWindowClickListener () o setOnMarkerClickListener () de su objeto GoogleMap. En otras palabras, solo puede configurar un oyente para todos los mapas, así que no puedo diferenciar los toques en las paradas de autobús o en los autobuses.
- El método onClick de ambos marcadores solo recibe el objeto Marker, 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 resolverse utilizando diferentes subcláusulas de Marker, pero no tiene un constructor y se obtiene su referencia al agregarlo al mapa, así que no sé si es posible usar una implementación personalizada.
La API es nueva, 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.
EDITAR: Una captura de pantalla del mapa de mi aplicación actual con dos tipos de marcadores:
Ok, aquí hay una solución que decidí usar y AFAIK debería 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());.
...
}
Puedes usar el HashMarker así. En este ejemplo, los puntos de carga en Arraylist y cada uno de ellos mantienen un nuevo ArrayList con coordenadas. Y la idea es que obtengas una identificación de punto.
Crear un HashMap
Marcadores = nuevo HashMap ();
Luego creas un marcador y lo agregas al mapa.
marcador de marcador final = map.addMarker (nuevas MarkerOptions (). position (new LatLng (coordenadas.get (j) .getLat (), coordenadas.get (j) .getLon ())) título (point.getName ()) );
A continuación, puede guardar el ID de punto con el valor de marcador de
Markers.put (marcador, point.getId ());
Y al final, puede obtener el valor de ID al hacer clic en la ventana de información
public void onInfoWindowClick (marcador de marcador) {
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
}
O
Cuando haces clic en el marcador
público booleano onMarkerClick (marcador arg0) {
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
return false;
}
Puedes utilizar el método getId
del marcador getId