使用片段保存和恢复状态

God*_*ryd 2 android savestate android-fragments

我试图了解使用片段保存和恢复状态的过程。我用它创建了滑动导航菜单。

在其中一个片段中有这样的代码:

public class FifthFragment extends Fragment {

    CheckBox cb;
    View view;

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

        view = inflater.inflate(R.layout.fifth_layout, container, false);
        cb = (CheckBox) view.findViewById(R.id.checkBox);
        return view;

    }

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

        if (savedInstanceState != null) {
            // Restore save state
        }

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // save state
    }

}
Run Code Online (Sandbox Code Playgroud)

例如,我想在用户退出片段之前保存复选框的状态,并在再次创建片段时恢复它。如何实现这一目标?

编辑:

根据 raxellson 的回答,我已将片段更改为:

public class FifthFragment extends Fragment {

    private static final String CHECK_BOX_STATE = "string";
    CheckBox cb;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fifth_layout, container, false);

        cb = (CheckBox) view.findViewById(R.id.checkBox);
        if (savedInstanceState == null) {
            Log.i("statenull", "null");
        }
        if (savedInstanceState != null) {
            // Restore last state for checked position.
            boolean checked = savedInstanceState.getBoolean(CHECK_BOX_STATE, false);
            cb.setChecked(checked);
        }

        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(CHECK_BOX_STATE, cb.isChecked());
    }

}
Run Code Online (Sandbox Code Playgroud)

我已登录I/statenull: null,因此未保存savedInstanceState。我究竟做错了什么?

mal*_*ing 5

您想要将当前选中状态的值保存在 中onSaveInstanceState

像这样的东西:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(CHECK_BOX_STATE, cb.getChecked());
}
Run Code Online (Sandbox Code Playgroud)

然后,当创建视图时,您希望获取该值(如果存在)。并CheckBox用它设置你的状态。

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fifth_layout, container, false);

    cb = (CheckBox) view.findViewById(R.id.checkBox);
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        boolean checked = savedInstanceState.getBoolean(CHECK_BOX_STATE, false);
        cb.setChecked(checked);              
    }

    return view;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

添加片段时,请确保添加标签或 ID,以便您可以检索相同的实例。

您可以使用辅助方法来检索片段并设置片段。

private void setFragment(String tag, Fragment newFragment) {
   FragmentManager fm = getSupportFragmentManager();
   Fragment savedFragment = fm.getFragmentByTag(tag);
   fm.replace(R.id.container, savedFragment != null ? savedFragment : newFragment, tag);
   fm.commit();
}
Run Code Online (Sandbox Code Playgroud)

所以你switch可以调用辅助方法。

switch (position) {
   case 0:
   setFragment("A", new FragmentA());
   break;
   ....
}
Run Code Online (Sandbox Code Playgroud)

注意:这只是一个示例,并非最佳实践,因为无论如何您现在每次都会创建新的片段switch case。但它可能会为您指明正确的方向。

  • 这对我不起作用。我添加了 `if (savedInstanceState == null) { Log.i("statenull", "null"); }`。每次我打开该片段时它都会记录下来:/ (2认同)