GoogleMap - animateCamera()在片段恢复后无所作为

时间:2014-12-01 18:22:00

标签: android google-maps-android-api-2 android-mapview

我在布局中使用GoogleMap / MapView,但作为一个视图而不是片段(因为父级需要是一个片段),所以片段的布局包括:

<com.google.android.gms.maps.MapView
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

片段包含:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
    <......>
    initMap(bundle, mapView);
    return rootView;
}

@Override
public void onResume() {
    super.onResume();
    MyApp.bus.register(this);
    updateMapLocation(MyApp.getMostRecentLocation());
}

@Override
public void onPause() {
    super.onPause();
    MyApp.bus.unregister(this);
}

@Subscribe
public void locationReceived(LocationReceived m) {
    Timber.i("Received bus message - Location!");
    updateMapLocation(MyApp.getMostRecentLocation());
}

其父级Fragment包含:

private MapView mapView;
private GoogleMap map;

@Override
public void onResume() {
    super.onResume();
    if (mapView!=null) {
        mapView.onResume();
        map = this.mapView.getMap();
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mapView!=null) mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    if (mapView!=null) mapView.onLowMemory();
}

protected void initMap(Bundle bundle, MapView mapView) {
    this.mapView = mapView;
    this.mapView.onCreate(bundle);
    map = this.mapView.getMap();
    map.getUiSettings().setMyLocationButtonEnabled(false);
    map.setMyLocationEnabled(true);
    map.setBuildingsEnabled(true);
    map.getUiSettings().setZoomControlsEnabled(false);
    map.getUiSettings().setMyLocationButtonEnabled(true);
    try {
        MapsInitializer.initialize(this.getActivity());
    } catch (Exception e) {
        Timber.e(e, "Error initialising Google Map");
    }
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(MyApp.getCentralUKLatLng(), getResources().getInteger(R.integer.map_zoom_initial));
    map.animateCamera(cameraUpdate);
}

@Override
public void onPause() {
    super.onPause();
    if (mapView!=null) mapView.onPause();
}

protected void updateMapLocation(Location location) {
    Timber.i("Moving map to a new location: " + location);
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
    map.animateCamera(cameraUpdate);
}

通过Otto巴士提供新地点。上面的代码完美无缺,但仅限第一次。如果我在此前面打开另一个片段,然后再将其关闭,则地图无法为随后提供的位置设置动画。肯定会收到位置,绝对会调用animateCamera()方法(使用有效的位置和缩放),但绝对没有任何反应。没有错误,没有日志消息,没有。令它更令人愤怒的是一个片段(与上面的代码相同),它在恢复片段时工作正常。

我认为我在恢复时如何(重新)初始化GoogeMap或MapView时出错了,但是我通过对MapView的onPause()和onResume()调用,我理解的是必要。我还需要做什么?

1 个答案:

答案 0 :(得分:2)

这是因为你没有在onResume()中编写代码。 看到当你打开和关闭第二个片段时,第一个片段将始终保持在那里,所以当第二个片段关闭时,第一个片段的onResume()将被调用。 所以你必须在onResume()中为相机设置动画。