使用FragmentTabHost保存FragmentActivity中的Fragment状态



我有一个带有FragmentTabHost的Fragment Activity。我使用以下代码将片段添加到选项卡:

    mTabHost.addTab(mTabHost.newTabSpec(tab1Name).setIndicator(tabIndicator1),
            EventSettingsStep1Fragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec(tab2Name).setIndicator(tabIndicator2),
            EventSettingsStep2Fragment.class, null);

当我切换到不同的选项卡时,我想保留所有的值(视图状态等),这样当我切换回选项卡时我就有了相同的数据。

我重写了onSaveInstanceState方法&在那里,我将想要保留的值添加到bundle中。

我浏览了被调用的方法,得到了以下内容:

从Tab1切换到Tab2:Tab1:onPause,然后Tab2:onCreateView,Tab2:onResume

从Tab2切换到Tab1:Tab2:onPause,然后Tab1:onCreateView,Tab1:onResume

onSaveInstanceState未被调用。

这是我的一个片段的代码:

public class EventSettingsStep1Fragment extends Fragment implements View.OnClickListener {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Log.d(TAG, "onCreateView");
    if (savedInstanceState != null) {
        Log.d(TAG, "restoring onSavedInstanceState");
        Gson gson = new Gson();
        event = gson.fromJson(savedInstanceState.getString("event"), Event.class);
    }

    if (event != null) {
        //set views 
    }
    return v;
}
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");
}
@Override
public void onPause() {
    super.onPause();
    Log.d(TAG, "onPause");
}
@Override
public void onSaveInstanceState(Bundle outState) {
    Log.d(TAG, "onSaveInstanceState");
    super.onSaveInstanceState(outState);
    Gson gson = new Gson();
    outState.putString("event", gson.toJson(event));
}

}

为什么没有调用onSaveInstanceState?是否仅通过FragmentActivity触发?

没有调用onSaveInstanceState,因为框架只是重用片段的现有实例。onSaveInstanceState仅在实例即将销毁然后重新创建时调用。例如,当您旋转显示并强制重新创建宿主活动时,就会发生这种情况。

在FragmentManager的后台推送片段时,也不会调用onSaveInstanceState。您将不得不从已经存在的实例中恢复状态,这可能非常烦人。请参阅SO问题当添加到后堆栈时,我如何维护片段状态?一劳永逸,如何正确保存后栈中Fragments的实例状态?例如

基本上,您必须按照这些问题的答案进行操作:继续使用实例变量的值,不要依赖于保存的实例状态。

最新更新