首页 文章

Android:保存并恢复片段的状态

提问于
浏览
2

我在活动中使用片段(v4) . 片段显示了GoogleMap,我想在应用进入后台时保存 Map 的相机位置/状态,并在相机再次进入前景后恢复相机 .

android.support.v4.app.Fragment

摄像机状态保存在 onSaveInstanceState(Bundle) 中并在 onViewStateRestored(Bundle) 中恢复 . 但我想知道这些方法是否正确 . 为什么?因为当您切换到同一应用程序中的另一个活动时,以及当您返回主屏幕或启动另一个应用程序时,会调用onSaveInstanceState . 一切安好 . 但永远不会调用onViewStateRestored方法 .

Q: 那有什么不对?

public class MapFragment extends Fragment implements OnMapReadyCallback {

    private final String SAVED_CAMERA_STATE = "state_map_camera";

    private GoogleMap map;
    private CameraPosition camera;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_map, container, false);

        SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if (savedInstanceState != null)
            camera = savedInstanceState.getParcelable(SAVED_CAMERA_STATE);
        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (map == null)
            return;

        // save camera state
        outState.putParcelable(SAVED_CAMERA_STATE, map.getCameraPosition());
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);

        if (savedInstanceState == null)
            return;

        camera = savedInstanceState.getParcelable(SAVED_CAMERA_STATE);

        // restore the camera state;
        if (map != null && camera != null)
            map.moveCamera(CameraUpdateFactory.newCameraPosition(camera));
    }

    @Override
    public void onMapReady(GoogleMap map) {

        this.map = map;

        // ToDo: add your markers to the map

        // restore the camera state
        if (camera != null) {
            map.moveCamera(CameraUpdateFactory.newCameraPosition(camera));
    }
}

1 回答

相关问题