0

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

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

当我切换到不同的选项卡时,我想保留所有值(视图状态等),以便在切换回选项卡时拥有相同的数据。

我覆盖了 onSaveInstanceState 方法并在其中添加了我想要保留到包中的值。

我运行了被调用的方法,我有以下内容:

从 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 触发?

4

1 回答 1

2

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

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

基本上,您必须按照这些问题的答案所建议的去做:继续使用实例变量的值,不要依赖保存的实例状态。

于 2013-07-17T07:18:16.670 回答