如何在片段中保存状态
How to save state in fragment
我有 4 个按钮来替换 activity [片段 A、片段 B、片段 C、片段 D] 中的片段,然后我将片段 A 替换为 activity 并更改片段 A 中的值之后我将片段 B 替换为片段 A 并将片段 C 替换为片段 B 。但我想将片段 A 替换为片段 C 。如何在片段 A 中保存状态。
提交片段时的代码
private void beginFragmentTransaction(BaseFragment fragment) {
String tag = fragment.getClass().getName();
currentFragmentTag = tag;
boolean fragmentPopped = getChildFragmentManager().popBackStackImmediate(tag, 0);
if (!fragmentPopped) {
getChildFragmentManager().beginTransaction()
.replace(R.id.container, fragment, tag)
.addToBackStack(tag)
.commit();
}
}
要替换的图表
fragment A -------> fragment B
fragment B -------> fragment C
fragment C -------> fragment A
PS。我不想使用后退按钮返回到片段 A ,我想在第一次提交时替换片段 A 并恢复数据。
您可以选择实现 onRestoreInstanceState()
,而不是在 onCreate()
期间恢复状态,系统会在 onStart()
方法之后调用它。系统只有在有保存状态需要恢复时才会调用onRestoreInstanceState()
,所以不需要检查Bundle
是否为null。
仅供参考:这是示例代码。仅供参考。
public class MainFragment extends Fragment {
private String title;
private double rating;
private int year;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString(TITLE, "Gladiator");
savedInstanceState.putDouble(RATING, 8.5);
savedInstanceState.putInt(YEAR, 2000);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
title = savedInstanceState.getString(TITLE);
rating = savedInstanceState.getDouble(RATING);
year = savedInstanceState.getInt(YEAR);
}
}
仅供参考:这真的是一个很好的话题,也请检查一下Once for all, how to correctly save instance state of Fragments in back stack?
如果您想保存以前选项卡的状态并且不想refresh/recreate查看使用此代码并根据选项卡限制更改值
ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
您可以显示和隐藏保存状态的片段,
或使用导航组件最新版本
我有 4 个按钮来替换 activity [片段 A、片段 B、片段 C、片段 D] 中的片段,然后我将片段 A 替换为 activity 并更改片段 A 中的值之后我将片段 B 替换为片段 A 并将片段 C 替换为片段 B 。但我想将片段 A 替换为片段 C 。如何在片段 A 中保存状态。
提交片段时的代码
private void beginFragmentTransaction(BaseFragment fragment) {
String tag = fragment.getClass().getName();
currentFragmentTag = tag;
boolean fragmentPopped = getChildFragmentManager().popBackStackImmediate(tag, 0);
if (!fragmentPopped) {
getChildFragmentManager().beginTransaction()
.replace(R.id.container, fragment, tag)
.addToBackStack(tag)
.commit();
}
}
要替换的图表
fragment A -------> fragment B
fragment B -------> fragment C
fragment C -------> fragment A
PS。我不想使用后退按钮返回到片段 A ,我想在第一次提交时替换片段 A 并恢复数据。
您可以选择实现 onRestoreInstanceState()
,而不是在 onCreate()
期间恢复状态,系统会在 onStart()
方法之后调用它。系统只有在有保存状态需要恢复时才会调用onRestoreInstanceState()
,所以不需要检查Bundle
是否为null。
仅供参考:这是示例代码。仅供参考。
public class MainFragment extends Fragment {
private String title;
private double rating;
private int year;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString(TITLE, "Gladiator");
savedInstanceState.putDouble(RATING, 8.5);
savedInstanceState.putInt(YEAR, 2000);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
title = savedInstanceState.getString(TITLE);
rating = savedInstanceState.getDouble(RATING);
year = savedInstanceState.getInt(YEAR);
}
}
仅供参考:这真的是一个很好的话题,也请检查一下Once for all, how to correctly save instance state of Fragments in back stack?
如果您想保存以前选项卡的状态并且不想refresh/recreate查看使用此代码并根据选项卡限制更改值
ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
您可以显示和隐藏保存状态的片段, 或使用导航组件最新版本