我有一个片段,它有自己的状态(选定的按钮等)。该状态在屏幕旋转时丢失。
包含片段的活动在/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) { ... }
}

请注意,我使用的是通过actionbarsherlock引入的pre-3.0片段支持包。
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)有一个@override,所以我知道它不是像打字那样愚蠢的东西。
我看过一个actionBarSherlock示例(com.actionBarSherlock.sample.shakespeare)和片段,它们的onCreate()方法被正确调用。据我所知,这个例子正是按照我的代码编写的——通过布局和布局土地XML包含的片段。我甚至使用与主项目完全相同的actionbarsherlock版本构建了这个示例,保存实例状态对于这个示例来说很好。
如何在屏幕旋转中保留片段状态?为什么不给我打电话?

最佳答案

您可以启用myFragment.setRetainInstance(true)来保留状态,但它“自动”这样做,即它保留分配给类成员的值,并且不使用onSaveInstanceState(因此SavedInstanceState始终为空)。
确保承载此片段的FragmentActivity不会重写onSaveInstanceState,或者在重写时应该调用super.onSaveInstanceState(Bundle)

10-08 18:02