¿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.

3 Solutions collect form web for “¿Cuándo puedes llamar a GoogleMap.moveCamera después de onMapReady de OnMapReadyCallback?”

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)); } }); 
  • Android obtener y analizar Google Directions
  • Ocultar infoWindow cuando se hace clic en el marcador por segunda vez (Google Map Android API V2)
  • Buscar ruta con Androids API de Google Maps
  • ¿Cómo persistir Marcador de Google API Android v2?
  • Extracción de datos de Google Maps Place (específicamente los precios de la gasolina)
  • Android + cargador universal de imágenes: muestra marcador personalizado con imagen en google map
  • El mapa de Google llamado dentro de un fragmento devuelve null
  • GoogleMap CameraUpdate se mueve a coordenadas incorrectas
  • Cómo ocultar los botones "Navegación" y "Puntero GPS" cuando hago clic en el marcador en el mapa google de Android
  • Android Google Maps API v2: obtener mi ubicación de rodamiento
  • ¿Cómo cambiar el icono de marcador de lo que fue aprovechado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.