¿Cuándo puedes llamar a GoogleMap.moveCamera después de onMapReady de OnMapReadyCallback?

La actual API de Google Maps para Android requiere que llame a mapFragment.getMapAsync con un OnMapReadyCallback antes de poder acceder a GoogleMap . Asumí que una vez que tuviera el GoogleMap sería seguro llamar a moveCamera() pero yo estaba viendo informes de fallo con una IllegalStateException que dijo que el Map size can't be 0. Most likely, layout has not yet occured for the map view .

Así que intenté agregar un ViewTreeObserver.OnPreDrawListener , y mover la llamada moveCamera() al método onPreDraw , como los documentos para que diga "En este punto, todas las vistas en el árbol se han medido y dado un marco". Pero todavía veo algunos informes de fallo con el mismo problema. No puedo encontrar ninguna documentación para esto – hay preguntas como moveCamera con CameraUpdateFactory.newLatLngBounds se bloquea, pero pre-fecha de la API getMapAsync , por lo que no son de mucha ayuda.

Tuve el mismo problema. Esta biblioteca de google maps lanza la excepción cuando una aplicación intenta cambiar la cámara con esta actualización de cámara hasta que el mapa se haya sometido a diseño (para que este método determine correctamente el cuadro delimitador y el nivel de zoom adecuados, el mapa debe tener un tamaño). Se describe aquí .

Es mi solución:

 @Override public void onMapReady(GoogleMap googleMap) { googleMap.setOnMapLoadedCallback(this); } @Override public void onMapLoaded() { googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(…)); } 

Yo tuve el mismo problema. Adapté una solución del enlace que proporcionaste, que parece funcionar para mí. En onCreate ():

 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() {displayMap();} }); 

OnGlobalLayoutListener () parece que se llama varias veces por diseño, por lo que tal vez un oyente más objetivo sería mejor. Para evitar la ineficiencia de manipular el mapa más de lo necesario, he utilizado un boolean mMapInitialised.

OnMapReady ():

 @Override public void onMapReady(GoogleMap map) { mMap = map; displayMap(); // if width of MapFragment is known } 

DisplayMap ():

 void displayMap() { // Check that mMap has been initialised AND the width of the MapFragment has been set: if (mMapInitialised || mMap==null) return; if (mMapFragment.getView().getRight() <= 0) return; LatLngBounds bounds = new LatLngBounds(new LatLng(mLat_min,mLng_min), new LatLng(mLat_max,mLng_max)); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, 10); mMap.moveCamera(cameraUpdate); mMapInitialised = true; } 

Usted puede hacer lo que quiera justo después de que se reciba onMapReady (GoogleMap googleMap) llamado.

Esto está funcionando ahora mismo en mi aplicación:

 mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { map = googleMap; map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(usr.getLatitud(), usr.getLongitud()), 14.6f)); } }); 
  • Generación del mapa de Google Clave de la API de lanzamiento
  • Google Maps v2 no se muestra después de publicar en el mercado de juegos
  • Cómo mostrar mapas en una aplicación de Android, si los servicios de Google Play no están instalados en un teléfono
  • Android googlemaps V2 - Desactivar desplazamiento en panorámica o zoom
  • Mostrar el botón de direcciones en Google Map cuando se abre la ventana de información mediante programación
  • Google maps glitch en los teléfonos Motorola
  • ¿Por qué la firma no es válida en la API de Google Maps para Android?
  • Destacando una calle en Google Maps en android
  • MapView en ExpandableListView
  • Mapa de Google que muestra texto de derechos de autor adicional en algunos dispositivos
  • La superposición de información de tráfico se muestra siempre encima de otras polilíneas en el mapa de google en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.