我试图理解使用片段保存和恢复状态的过程。我用它创建了滑动导航菜单。
其中一个片段中有以下代码:
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。我做错了什么?
查看所有示例后。这是保存片段状态的解决方案:
为此,有两个步骤:
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接收您的值。
您想将当前选中状态的值保存在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导航抽屉切换片段时保存片段的状态。如果片段先前已加载,则不应刷新。有可能吗?