16

Soy un programador de Android novato.Android - IllegalStateException: el mapa tiene un tamaño cero

Permítanme darles un contexto.
Mi proyecto usa ActionBarSherlock.

  1. I tienen una actividad (Activity1) que contiene dos fragmentos - una SherlockListFragment y una SherlockFragment que contiene un MapView los mapas de Google (esencialmente un MapFragment).
  2. Los resultados de búsqueda se muestran en el fragmento de la lista y el fragmento de mapa, y un botón de opciones de la barra de acciones alterna el Fragmento que se muestra actualmente entre la lista y el mapa.
  3. Al seleccionar un elemento en la lista o en el mapa de resultados de búsqueda, se inicia una nueva actividad (Actividad2) que muestra los datos del elemento seleccionado.
  4. Esta nueva actividad tiene un flujo similar: un fragmento para mostrar los datos y un fragmento de mapa para mostrar una ubicación, alternados por un botón de opciones de la barra de acciones.

El problema:

  1. que puede seleccionar un elemento de la lista en el fragmento de la lista de resultados de búsqueda (Actividad1) y la página de detalles (Actividad2) se inició con éxito.
  2. Cuando selecciono un elemento del mapa de la superposición del mapa en (Actividad 1), la aplicación se bloquea y aparece la pila mostrada a continuación.

Lo que he probado hasta ahora:

  1. He buscado "mapa tiene tamaño cero" y muchas permutaciones de la misma búsqueda incluyendo "androide" y "IllegalStateException" y varias líneas de el stacktrace y he examinado resultados que ni siquiera se relacionan con Android, pero que se relacionan con las API de google apis en general, y no he podido encontrar nada ni nadie en ninguna parte que haya encontrado este error excepto en este url http://www.androidpub.com/1551654 Pero No sé coreano, y el traductor de Google no fue de mucha ayuda.
  2. He intentado encontrar algunos fragmentos del código fuente para ver qué está sucediendo, pero eso no resultó en nada.
  3. He agregado registros en mi código para tratar de identificar dónde ocurre la excepción, y todo lo que he podido encontrar es que ocurre en algún momento después de (Activity2) comienza la actividad de detalles, es decir, después de onCreate () se llama. Y tanto el fragmento de detalles como el fragmento de mapa han sido exitosamente instanciados en onCreate(). No he podido encontrar un lugar en mi código ni siquiera para detectar la excepción. Entonces, por todo lo que puedo ver, esta excepción parece ser un error en el código MapView de Google, pero si cometí un error en algún lugar, muéstralo. Estoy dispuesto a ayudar a cualquiera que pueda decirme qué está pasando aquí.

Así que, en resumen. El bloqueo ocurre cuando se pasa de una actividad (Actividad1) con una vista de mapa que se muestra actualmente a otra actividad (Actividad2) que también alberga un fragmento que contiene otra vista de mapa. Pero el bloqueo no se produce al pasar del fragmento de la lista que se muestra en (Actividad1) a la otra actividad (Actividad2) que contiene otro fragmento de mapa.

Espero que esto sea suficiente detalle. Si tiene alguna pregunta, comente por favor.

D/memalloc( 121): /dev/pmem: Allocated buffer base:0x4215c000 size:2088960 offset:4177920 fd:66 
D/memalloc(30944): /dev/pmem: Mapped buffer base:0x5b4f5000 size:6266880 offset:4177920 fd:164 
D/AndroidRuntime(30944): Shutting down VM 
W/dalvikvm(30944): threadid=1: thread exiting with uncaught exception (group=0x40aaa228) 
E/AndroidRuntime(30944): FATAL EXCEPTION: main 
E/AndroidRuntime(30944): java.lang.IllegalStateException: Map has zero size 
E/AndroidRuntime(30944): at android_maps_conflict_avoidance.com.google.googlenav.map.Map.drawMap(Map.java:818) 
E/AndroidRuntime(30944): at com.google.android.maps.MapView.drawMap(MapView.java:1091) 
E/AndroidRuntime(30944): at com.google.android.maps.MapView.onDraw(MapView.java:522) 
E/AndroidRuntime(30944): at android.view.View.draw(View.java:11071) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10462) 
E/AndroidRuntime(30944): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10425) 
E/AndroidRuntime(30944): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10425) 
E/AndroidRuntime(30944): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10425) 
E/AndroidRuntime(30944): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10425) 
E/AndroidRuntime(30944): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605) 
E/AndroidRuntime(30944): at android.view.View.getDisplayList(View.java:10425) 
E/AndroidRuntime(30944): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:879) 
E/AndroidRuntime(30944): at android.view.ViewRootImpl.draw(ViewRootImpl.java:1948) 
E/AndroidRuntime(30944): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1654) 
E/AndroidRuntime(30944): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498) 
E/AndroidRuntime(30944): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(30944): at android.os.Looper.loop(Looper.java:154) 
E/AndroidRuntime(30944): at android.app.ActivityThread.main(ActivityThread.java:4894) 
E/AndroidRuntime(30944): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(30944): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(30944): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
E/AndroidRuntime(30944): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
E/AndroidRuntime(30944): at dalvik.system.NativeStart.main(Native Method) 
E/EmbeddedLogger( 254): App crashed! Process: com.myapp.android 
E/EmbeddedLogger( 254): App crashed! Package: com.myapp.android v5 (2.0) 
E/EmbeddedLogger( 254): Application Label: myapp 
W/ActivityManager( 254): Force finishing activity com.myapp.android/.activity.InfoActivity 
W/ActivityManager( 254): Force finishing activity com.myapp.android/.activity.SearchActivity 
+1

He encontrado este hilo, mientras que la búsqueda de la misma errormsg "Map tiene tamaño cero", descubrí que me he fijado accidentalmente otro elemento en "match_parent" en lugar de "wrap_content "y así empujar la vista del mapa de la pantalla, lo que da como resultado este error. ¿Estás seguro de que tu diseño realmente puede mostrar el MapView? – Fluff

+0

Me he enfrentado al mismo problema, en mi caso, he hecho algunos cambios en el archivo XML – Sridhar

+0

¿está utilizando un proceso diferente para las dos actividades que contienen mapview. http://stackoverflow.com/questions/3379575/how-to-use-multiple-mapactivities-mapviews-per-android-application-process/3380655#3380655 –

Respuesta

0

En este punto de mi experiencia, la única manera de evitar este error, es no utilizar MapViews dentro Fragmentos.Mover una vista de mapa en todo por si la animación o alterar su posición una vez que se ha agregado a una vista principal siempre me ha causado problemas. La forma más efectiva que he encontrado es alternar entre un mapa y otra vista donde MapActivity gestiona MapView y un fragmento gestiona la otra Vista. Reimplementé la misma función nuevamente, y esto ha funcionado sin problemas. Sin embargo, me gustaría observar que esto es una solución para un problema con una causa desconocida (muy probablemente un error en la API de mapas de Android).

0

Estoy totalmente en desacuerdo con Adam's! Administrar fragmentos y actividades es la mejor práctica de todos los tiempos.

Es bastante diferente, y algunas veces es incluso más difícil encontrar algo, pero administrar un fragmento de mapa como un fragmento en sí mismo o dentro de otro fragmento para ser utilizado por varias actividades es lo mejor que puede hacer si planea incluir mapas en varias vistas de su aplicación.

Así que, yendo al grano, ya que no ha publicado ningún código, supongo que está animando que una cámara puede restablecer los límites, o simplemente puede configurar un centro inicial para su mapa. (probablemente el primero ya que muestra resultados)

Y en ese caso, la excepción estaría en la línea map.animateCamera(...), porque está tratando con algo que está disponible pero que aún no está inflado.

prueba este:

try{ 
     cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,yourPadding); 
     map.animateCamera(cu); 
     System.out.println("Set with padding"); 
    } catch(IllegalStateException e) { 
     e.printStackTrace(); 
     cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,someWidth,someHeight,zeroPadding); 
     map.animateCamera(cu); 
     System.out.println("Set with whp"); 
    } 
Cuestiones relacionadas