为什么我的片段onSaveInstanceState()不被调用?

时间:2012-02-23 00:53:14

标签: android android-fragments actionbarsherlock

我有一个有自己状态的片段(选择按钮等)。该状态在屏幕旋转时丢失。

包含片段的活动在/ res / layout /中具有纵向布局,在/ res / layout-land /中具有几乎相同的横向布局。两种布局都包含这样的片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <fragment
        android:id="@+id/testFragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        class="au.com.x.y.TestFragment" />
...</LinearLayout>

我一直在测试的片段类是:

public class TestFragment extends android.support.v4.app.Fragment {
    private static final String TAG = "TestFragment";
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate(): " + 
                (savedInstanceState != null ? "NOT NULL" : "NULL"));
    }
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(TAG, "onActivityCreated(): " + 
                (savedInstanceState != null ? "NOT NULL" : "NULL"));
    }
    public void onSaveInstanceState(Bundle state) {
        super.onSaveInstanceState(state);
        Log.i(TAG, "onSaveInstanceState()");
        state.putString("saved_thing", "some_value");
    }
    public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle b) { ... }
}

请注意,我正在使用3.0之前的支持包,通过ActionBarSherlock引入片段。

LogCat给了我:

BEFORE SCREEN ROTATION (PORTRAIT):
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL
02-23 11:45:58.015: I/TestFragment(22629): onCreateView()
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL
AFTER SCREEN ROTATION (LANDSCAPE):
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL
02-23 11:46:00.615: I/TestFragment(22629): onCreateView()
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL

如您所见,永远不会调用onSaveInstanceState(),并且savedInstanceStateonCreate()中的片段始终为空onActivityCreated()

我在我的活动myFragment.setRetainInstance(true)中尝试了onCreate(),但这并未改变任何内容。

我的onSaveInstanceState()有一个@Override,所以我知道这不是像拼写错误那样愚蠢。

我查看了一个ActionBarSherlock示例(com.actionbarsherlock.sample.shakespeare)以及正确调用其onSaveInstanceState()方法的片段。据我所知,这个例子写的是我的代码是如何 - 通过布局和布局 - 土地XML包含的片段。我甚至使用与我的主项目使用完全相同的ActionBarSherlock版本来构建该示例,并保存实例状态适用于该示例。

如何在屏幕旋转中保留我的碎片状态?为什么不调用onSaveInstanceState()

2 个答案:

答案 0 :(得分:23)

您可以启用myFragment.setRetainInstance(true)来保留状态,但它会“自动”执行此操作,即它保留分配给您的类成员的值,并且不使用onSaveInstanceState(因此savedInstanceState始终为null)。 / p>

确保托管此片段的FragmentActivity不会覆盖onSaveInstanceState,否则应该调用super.onSaveInstanceState(Bundle)

答案 1 :(得分:0)

如果片段在旋转时需要不同的布局资源,则无法使用setRetainInstance(true)。这个page显示了setRetainInstance(true)片段的生命周期。

最初的想法是使用onSaveInstanceState()来保留所有成员数据,就像常规活动一样。但是,出于某种原因,onSaveInstanceState()不会被调用。但FragmentActivity是正确的,正如@Eric Kok建议的那样。我找到的最佳解决方案是使用片段的参数

solutionFyodor Volchyok,这很简单。就像onSaveInstanceState()中的outState和onViewCreated()中的savedInstanceState一样工作。