当前的Android Google Maps API要求您使用mapFragment.getMapAsync
致电OnMapReadyCallback
,然后才能访问GoogleMap
。我假设一旦你有了GoogleMap
,就可以安全地拨打moveCamera()
,但我看到崩溃报告的IllegalStateException
表示Map size can't be 0. Most likely, layout has not yet occured for the map view
。
因此,我尝试添加ViewTreeObserver.OnPreDrawListener
,并将moveCamera()
调用移至onPreDraw
方法,因为该文档的文档说“此时,树中的所有视图都已被删除测量并给出一个框架“。但我仍然看到一些具有相同问题的崩溃报告。我找不到任何相关的文档 - 有moveCamera with CameraUpdateFactory.newLatLngBounds crashes之类的问题但它们早于getMapAsync
API,因此它们没有多大帮助。
答案 0 :(得分:10)
我有同样的问题。当应用尝试使用此相机更新更改相机时,此Google地图库会引发异常,直到地图经历了布局(为了使此方法正确确定合适的边界框和缩放级别,地图必须具有大小)。它描述了here。
这是我的解决方案:
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.setOnMapLoadedCallback(this);
}
@Override
public void onMapLoaded() {
googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(…));
}
答案 1 :(得分:0)
我遇到了同样的问题。我根据您提供的链接调整了解决方案,这似乎对我有用。在onCreate()中:
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {displayMap();}
});
每个布局似乎多次调用OnGlobalLayoutListener(),因此可能更精确的目标侦听器会更好。为了避免操作地图的效率低于必要,我使用了布尔值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;
}
答案 2 :(得分:-1)
您可以在调用mapReady(GoogleMap googleMap)后立即执行任何操作。
现在正在mi app中使用:
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(usr.getLatitud(), usr.getLongitud()), 14.6f));
}
});