如何在Fragment中保存状态

6

我有4个按钮用来在活动中替换片段[片段A,片段B,片段C,片段D],然后我将片段A替换为活动,并在更改了片段A的值之后将其替换为片段B,并将片段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();
    }

}

替换图示

碎片A -------> 碎片B

碎片B -------> 碎片C

碎片C -------> 碎片A

附注:我不想使用返回按钮回到碎片A,我想替换碎片A并还原第一次提交的数据。


1
为了保存Fragment状态,您需要实现onSaveInstanceState()方法:“与活动一样,您可以使用Bundle保留片段的状态,在情况下,活动的进程被杀死并且您需要在重新创建活动时恢复片段状态。您可以在片段的onSaveInstanceState()回调期间保存状态,并在onCreate()、onCreateView()或onActivityCreated()期间恢复它。” - Sudheesh R
我尝试使用onSaveInstanceState(),但它没有调用这个函数。当我再次替换此片段时,在onActivityCreated()中检查bundle时,bundle为null。@SudheeshR - Wuttipong Khemphetjetsada
1
好的,每次加载“fragment”时,您必须将“fragment details”保存在bundle中。尝试这种方式。 - Sudheesh R
1
同时也应该保留现有的数组或其他内容片段... - Sudheesh R
1
你也可以尝试这样做:使用片段的OnDestroyView()方法并在该方法中保存整个对象。然后,在OnActivityCreated()方法中:检查对象是否为null(因为该方法每次都会调用)。现在,恢复对象的状态。 - Sudheesh R
显示剩余6条评论
3个回答

6

你可以选择实现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);
}
}

提示:这是一个非常好的线程,您还可以查看此链接:一劳永逸:如何正确保存后退栈中片段的实例状态?


1

如果你想保存之前选项卡的状态,而不想刷新/重新创建视图,请使用以下代码,并根据选项卡限制更改值

ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2); 

0

你可以显示和隐藏片段以保存状态,或者使用最新版本的导航组件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接