¿Cómo comprobar si un InfoWindow de Google Maps todavía se muestra antes de actualizarlo?

Comencé a trabajar en un InfoWindowAdapter que está exhibiendo imágenes de la localización dentro del InfoWindow. Tengo muchas ubicaciones diferentes, por lo tanto, es posible que una imagen de ubicación no esté disponible en el teléfono y se descargue desde la web.

Ahora, la API de Google Maps indica lo siguiente:

Tenga en cuenta que se tomará una instantánea de la vista devuelta y se procesará en el mapa para que los cambios subsiguientes en la vista no se reflejen en la ventana de información del mapa. Para actualizar la ventana de información (por ejemplo, después de cargar una imagen), simplemente llame a showInfoWindow () y la vista se actualizará.

Como entiendo esto, necesito hacer un seguimiento del marcador que creó la ventana de información que quiero actualizar y llamar a showInfoWindow una vez que se carga la imagen. Tengo un ImageDownloadService que tomará un Handler que se notifica si una imagen es carga acabada.

Si una imagen tarda un poco más en cargar, es posible que el usuario haya abierto otra InfoWindow o haya cerrado la ventana actual desplazada. El problema es que en el momento en que llamo showInfoWindow en el marcador de nuevo para actualizar la vista, no puedo estar seguro de que InfoWindow todavía se muestra.

¿Hay alguna manera de actualizar el InfoWindow sólo si todavía se muestra?

Acabo de tener un problema similar con AsyncTask s descargar y actualizar un InfoWindow y después de mucho golpear mi cabeza contra la pared esta mañana he llegado con esta pequeña solución que esperamos que el servicio de sus necesidades hasta que Google ordenar este.

Estaba llamando a marker.showInfoWindow() en el método OnPostExecute() de mi AsyncTask , que volvía a llamar los métodos InfoWindowAdapter , que terminaba en un bucle y no propagaba mis cambios correctamente.

La solución que usé fue almacenar el marcador actualmente seleccionado y la vista de InfoWindow que quería mostrar. He chucked en un ejemplo a continuación, donde el TextView se está actualizando en el AsyncTask DownloadBubbleInfo (similar a su hilo de la imagen creo).

  // Setting a custom info window adapter for the google map gMap.setInfoWindowAdapter(new InfoWindowAdapter() { // Use default InfoWindow frame public View getInfoWindow(Marker arg0) { return null; } // Defines the contents of the InfoWindow public View getInfoContents(Marker arg0) { if (selectedMarker.isInfoWindowShown()) { return infoWindowView; } else { // Getting view from the layout file info_window_layout infoWindowView = getLayoutInflater().inflate( R.layout.bubblewindowlayout, null); // Stash the base view in infoWindowView // Getting reference to the TextView to set latitude TextView tvTit = (TextView) infoWindowView .findViewById(R.id.tv_title); tvTit.setText("Fetching data..."); // Async the update so we're not slowed down waiting for // the // bubble to populate new DownloadBubbleInfo(context, infoWindowView, arg0) .execute(arg0.getTitle(), arg0.getSnippet()); // Returning the view containing InfoWindow contents return infoWindowView; } } }); gMap.setOnMarkerClickListener(new OnMarkerClickListener() { public boolean onMarkerClick(Marker marker) { // When a marker is clicked set it as the selected marker so // we can track it for the InfoWindow adapter. This will // make sure that the correct marker is still displayed when // the callback from DownloadBubbleInfo is made to // marker.showInfoWindow() which is needed to update the // InfoWindow view. selectedMarker = marker; infoWindowView = null; return false; } }); 

Y las líneas relevantes de la AsyncTask DownloadBubbleInfo :

  @Override protected String[] doInBackground(String... queryparts) { // Do the query and stash the results in queryResults and pass to // onPostExecute to attach to the mainview (the current view from the // main code) and then call showInfoWindow on the marker to re-launch // the InfoWindowAdapter methods again to repopulate the InfoWindow view // and attach it. return queryResults; } protected void onPostExecute(String[] results) { ((TextView) mainview.findViewById(R.id.tv_title)).setText(results[0]); ((TextView) mainview.findViewById(R.id.tv_info)).setText(results[1]); marker.showInfoWindow(); Log.i("Chris-Debug", "Reshowing InfoWindow"); } 

Ahora, todo esto debe asegurarse de que el marcador correcto se está rellenando con la información correcta devuelta de su AsyncTask y hey presto otra esquina de la extremadamente torpe GoogleMaps v2 para Android API circunnavegó con éxito!

¿Es posible que el método boleano isInfoWindowShown () de Marker sea lo que buscas?

Marker # isInfoWindowShown () – Documentación de la API de Google Maps para Android v2

No puede ayudar cuando el InfoWindow se desplazó lejos de, sin embargo, para eso, creo, probablemente tendrá que convertir las coordenadas LatLng del marcador a coordenadas de pantalla o usar esto para comprobar si el marcador sigue en pantalla:

Cómo obtener el espacio Latitude / Longitude en Google Map V2 para Android

No estoy seguro de si es posible en absoluto para comprobar si la ventana en sí está todavía en los límites de la vista del mapa o no.

  • ¿Cómo centrarse en la ubicación en Google Maps, teniendo en cuenta una vista es en la parte superior de la misma?
  • Dibujo libremente por los dedos en Google Map
  • Agregar objeto 3D para asignar y desplazar alrededor de él
  • Android Maps error "No se pudo encontrar la clase 'android.app.AppOpsManager'"
  • Mostrar el icono de puntos azules en la ubicación actual Google Maps
  • Diferencia de versión de la API de Google Maps
  • ¿Cómo mover la cámara cuando el marcador sale de la pantalla?
  • Cómo obtener el espacio de latitud / longitud en Google Map V2 para Android
  • LocationClient no conectado en el método "onConnected"
  • Eliminación del resaltado al tocar infoAdaptador de ventana
  • Marcadores de clúster superpuestos por el icono de ubicación actual del usuario en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.