¿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)); } }); 
  • Obtenga la dirección de inicio / oficina de google maps
  • FindFragmentById (R.id.map) devuelve null en Android L
  • Android Maps: No se pudo cargar el mapa. No se pudo contactar con los servidores de Google
  • Mapa de Google en android, muestra en tamaño pequeño mapview
  • Cambio de color de los marcadores - Google Map V2 Android
  • Añadir ronda egde a un marcador de mapa
  • Posicionamiento de Google Maps v2 zoom en controles en Android
  • Google google mapv2 icono de la URL
  • Límites de uso de la API de zona horaria de Google
  • ¿Cómo cambiar el tipo de mapa de simple a satélite de PlacePicker de la API de Google Places?
  • GoogleMap CameraUpdate se mueve a coordenadas incorrectas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.