何时可以在OnMapReadyCallback的onMapReady之后调用GoogleMap.moveCamera?

时间:2015-06-19 10:17:10

标签: android google-maps

当前的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,因此它们没有多大帮助。

3 个答案:

答案 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));
            }
});