当前位置: 首页 > 知识库问答 >
问题:

使用片段保存和恢复状态

公孙英飙
2023-03-14

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

其中一个片段中有以下代码:

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
    }

}

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

编辑:

根据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());
    }

}

我已被记录,因此未保存savedInstanceState。我做错了什么?

共有2个答案

东郭自珍
2023-03-14

查看所有示例后。这是保存片段状态的解决方案

为此,有两个步骤:

1.

String saveValue;
 
 
 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            saveValue = "";
        } else {

            saveValue = savedInstanceState.getString("saveInstance");
          

        }
    }
@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        //save the values of fragment if destroy on second to back
        if (!saveValue.isEmpty())
            savedInstanceState.putString("saveInstance", saveValue);
       
    }

在onSaveInstanceState中,您可以保存您的值。销毁片段后,您可以通过onCreate接收您的值。

班浩皛
2023-03-14

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

像这样的东西:

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

然后,当你的视图被创建时,如果它存在的话,你想要得到它的值。并用它设置您的复选框状态。

@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;
}

编辑:

添加片段时,请确保使用标签或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();
}

因此,您可以调用helper方法。

switch (position) {
   case 0:
   setFragment("A", new FragmentA());
   break;
   ....
}

注意:这只是一个示例,不是最佳实践,因为您现在每次都在切换案例中创建新片段。但它可能会为你指明正确的方向。

 类似资料:
  • 我搜索了很多信息,但没有一个明确的。有人能给出一个明确的解决方案和一个例子吗?

  • 在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔。如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只笔,要用哪只就选哪只。 在Canvas中也可以这样,不过Canvas中的画笔永远只有一只。所以,如果要更换画笔的颜色,就需要保存和恢复状态。状态其实就是画布当前属性的一个快照,包括: 图形的属性值,如strokeS

  • 状态的保存与恢复 操作流程 为了状态的保存与恢复,我们可以先用栈上的一小段空间来把需要保存的全部通用寄存器和 CSR 寄存器保存在栈上,保存完之后在跳转到 Rust 编写的中断处理函数;而对于恢复,则直接把备份在栈上的内容写回寄存器。由于涉及到了寄存器级别的操作,我们需要用汇编来实现。 而对于如何保存在栈上,我们可以直接令 sp 栈寄存器直接减去相应需要开辟的大小,然后依次放在栈上。需要注意的是,

  • 我有一个片断,似乎是自动恢复状态的屏幕旋转配置更改。我可以在日志中验证每当屏幕旋转时在片段中调用onCreatView。尽管向下调用applyDefaults(),但当屏幕旋转并调用onCreateView()时,用户创建的草稿条目将被保留。 我的理解是,我必须在onSaveInstanceState()中保存状态,并在onCreateView()中恢复状态,但情况似乎并非如此。有人能解释一下吗?

  • 问题内容: 我想在使用Android的导航抽屉切换片段时保存片段的状态。如果该片段先前已加载,则不应刷新。可能吗? 问题答案: 要保持片段的状态,您必须在片段的内调用。它能做什么: 控制是否在活动重新创建期间保留片段实例(例如通过配置更改)。 这样可以保持活动重新创建的状态,但是在这种情况下,将不会重新创建活动,而是使用抽屉手动切换片段。在这种情况下,您不必在抽屉的click侦听器中创建新的片段,

  • 我想在使用androids导航抽屉切换片段时保存片段的状态。如果片段先前已加载,则不应刷新。有可能吗?