使用片段保存和恢复状态
Saving and restoring state using 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
}
}
例如,我想在用户退出片段之前保存 CheckBox 的状态,并在再次创建片段时恢复它。如何做到这一点?
编辑:
根据 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());
}
}
我已登录 I/statenull: null
,因此未保存 savedInstanceState。我做错了什么?
您想在 onSaveInstanceState
中保存当前选中状态的值。
像这样:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(CHECK_BOX_STATE, cb.getChecked());
}
然后当您的视图创建时,您想要获取该值(如果它存在)。并用它设置你的 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;
}
编辑:
添加片段时,请务必添加标签或 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();
}
所以你 switch
你可以调用辅助方法。
switch (position) {
case 0:
setFragment("A", new FragmentA());
break;
....
}
注意:这只是一个示例 不是 最佳实践,因为无论如何您现在每次都在 switch case
中创建新片段。但它可能会为您指明正确的方向。
看完所有的例子。这是保存片段状态的解决方案:
两个步骤:
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.
接收您的值
我正在尝试了解使用片段保存和恢复状态的过程。我用它创建了滑动导航菜单。
在其中一个片段中有这段代码:
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
}
}
例如,我想在用户退出片段之前保存 CheckBox 的状态,并在再次创建片段时恢复它。如何做到这一点?
编辑:
根据 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());
}
}
我已登录 I/statenull: null
,因此未保存 savedInstanceState。我做错了什么?
您想在 onSaveInstanceState
中保存当前选中状态的值。
像这样:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(CHECK_BOX_STATE, cb.getChecked());
}
然后当您的视图创建时,您想要获取该值(如果它存在)。并用它设置你的 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;
}
编辑:
添加片段时,请务必添加标签或 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();
}
所以你 switch
你可以调用辅助方法。
switch (position) {
case 0:
setFragment("A", new FragmentA());
break;
....
}
注意:这只是一个示例 不是 最佳实践,因为无论如何您现在每次都在 switch case
中创建新片段。但它可能会为您指明正确的方向。
看完所有的例子。这是保存片段状态的解决方案:
两个步骤:
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.
接收您的值