¿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.
- Google Maps v2, desaparecido 'android.support.v4.app.FragmentActivity'
- La API de Google Maps para Android no funciona con debug.keystore
- Uso de Google Map en Android
- SHA-1 huella dactilar del certificado keystore
- Pantalla en blanco de la API de Google Map API V2
- ¿Cómo hacer que el marcador aparezca en el centro de la ventana inicial de Google Map?
- Las API de Google lanzan error de no-crunch para android
- Aplicación de setRotation a Maps API v2
- LocationClient no conectado en el método "onConnected"
- Android mapa api-2 deshabilitar haga clic
- ¿Qué algoritmo utilizan los mapas de Google para calcular la dirección entre 2 puntos?
- Actividad de Map de Android se bloquea al salir Actividad
- Google Map falla con recursos $ NotFoundException cuando se reemplaza en FrameLayout
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)); } });
- Cómo evitar que se abran enlaces en el mini-navegador integrado de Gmail
- Enlace SSL mediante Google Volley