Diferenciar entre diferentes marcadores en Google Maps API v2 (identificadores únicos)
Tengo un ArrayList de una clase de encargo. Hay unos 10 objetos en la lista, cada uno con detalles como Title, Snippet, LatLng. He agregado con éxito todos los 10 a un mapa usando mis funciones de la clase de encargo como getTitle, getSnippet, getLatLng etc.
Ahora, cuando hago clic en la ventana de información (del marcador), quiero poder saber de alguna manera qué objeto de mi clase personalizada corresponde ese marcador.
- ¿Es posible establecer la clave de la API de Google Maps v2 mediante programación?
- Implementación de Google Map APIv2, línea de archivo XML binario # 6: Error al inflar fragmento de clase
- Abrir mapa de la calle trabajando offline en Android
- Adaptador de ventana de información personalizada con datos personalizados en el mapa v2
- Cambiar el tamaño de un mapa en tiempo de ejecución
Por ejemplo, si hago clic en el mercado de McDonald's, quiero poder saber qué elemento de mi ArrayList perteneció ese marcador.
He estado mirando el MarkerOptions y allí no parece ser cualquier cosa adentro allí que puedo utilizar para identificar el objeto de encargo relevante con.
Si la pregunta es demasiado confusa, permítanme que sea sencillo:
ArrayList<CustomObj> objects = blah map.addMarker(new MarkerOptions().position(new LatLng( Double.parseDouble(result.get(i).getCompanyLatLng() .split(",")[0]), Double.parseDouble(result .get(i).getCompanyLatLng().split(",")[1]))) .title(result.get(i).getCompanyName()) .snippet(result.get(i).getCompanyType()) .icon(BitmapDescriptorFactory .fromResource(R.drawable.pin)));
Ahora, cuando se hace clic en esto, voy a la siguiente página. La siguiente página necesita saber qué objeto se ha hecho clic para poder enviar los demás detalles a esa página (por ejemplo, URL de imagen que deben cargarse, etc.).
¿Cómo añado un número entero único o cualquier identificador a mi marcador?
- Android Maps API v2: Polyline se dibuja bajo la superposición de mosaico
- La mejor forma de volver a crear marcadores / polilíneas cuando se gira el teléfono (cambio de orientación)
- ¿Cómo acceder al cambio de ubicación en segundo plano para Google Maps android API v2?
- Google Maps API V2 - InfoWindow se pierda el marcador
- Google Maps v2 Projection.toScreenLocation (...) muy lento
- Google Maps Android API v2: Error al cargar mapa. No se pudo contactar con los servidores de Google
- Google Map Android API v2: GoogleMap es nulo
- Cómo ampliar la cámara para cubrir la ruta en android googlemap?
Una forma correcta es usar Map<Marker, CustomObj>
que almacena todos los marcadores:
Marker marker = map.addMarker(...); map.put(marker, result.get(i));
Y en onInfoWindowClick
:
CustomObj obj = map.get(marker);
Otro intento es utilizar Android Maps Extensions , que añaden el método getData
y setData
a Marker
, por lo que puede asignar su objeto CustomObj
después de crear el marcador y recuperarlo en cualquier devolución de llamada.
Utilicé el texto del fragmento para guardar un ID único. Si necesitas el fragmento es para el popup y allí puedes hacer tu propio (encontrando el objeto desde el ID) para que no te lo pierdas, pero sin duda te perderás un identificador único para identificar los objetos.
Para encontrar el objeto correcto simplemente iterar a través de ellos:
for(SomeObject anObject : someObjects) { if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) { //you got at match } }
De acuerdo con la discusión en el siguiente enlace, Marker.equals y Marker.hashCode no funcionan a veces. Por ejemplo, cuando el mapa es panorámico o ampliado, o se reinicia / reanuda.
Añadir etiqueta / identificador a marcadores
Así que el ID de Marcador es una mejor clave que el propio Marcador para un HashMap.
Map<String, MyObject> markerMap = new HashMap<String, MyObject>(); Marker marker = map.addMarker(...); MyObject myObject = new MyObject(); markerMap.put(marker.getId(), myObject);
Creo que usando la latitud y la longitud, esto podría ser hecho
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(final Marker marker) { LatLng pos = marker.getPosition(); int arryListPosition = getArrayListPosition(pos); return true; } });
Y el método getArrayListPosition
es
private int getArrayListPosition(LatLng pos) { for (int i = 0; i < result.size(); i++) { if (pos.latitude == result.get(i).getCompanyLatLng().split(",")[0]) { if (pos.longitude == result.get(i).getCompanyLatLng() .split(",")[1]) return i; } } return 0; }
Este método le devolverá la posición de su ArrayList
que es el Marker
que ha hecho clic. Y puede obtener datos de esa posición.
Espero eso ayude…
Estoy con 4 años de retraso para responder, pero realmente me sorprendí por qué nadie habló de marker.setTag
y el método marker.getTag
.
Como se escribe en google API Documentos,
Esto es más fácil que almacenar un
Map<Marker, Object>
separadoMap<Marker, Object>
Han introducido setTag
y getTag
para evitar el uso de Map<...>
. Puede usarlo de la siguiente manera.
Marker marker = map.addMarker(...); marker.setTag(result.get(i)); //Store your marker information here. //To fetch your object... map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { CustomObj obj = (CustomObj)marker.getTag(); //Your click handle event // Pass the obj to another activity and you are done return false; } });
- ¿Cómo manejar ** Grid View ** en el cambio de configuración?
- Depurar android: conectar a sqlite db en el teléfono