我有一個具有自己的狀態(選定的按鈕等)的片段。屏幕旋轉時狀態丟失。爲什麼不調用我的片段onSaveInstanceState()?
包含該片段的活動在/ 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()
不會被調用,而片段總是得到一個空savedInstanceState
,在這兩個onCreate()
和onActivityCreated()
。
我試過myFragment.setRetainInstance(true)
在我的活動onCreate()
,但這並沒有改變任何東西。
我的onSaveInstanceState()
有一個@Override,所以我知道這不像一個錯字。
我看了一個ActionBarSherlock的例子(com.actionbarsherlock.sample.shakespeare)和片段有onSaveInstanceState()
正確調用的方法。據我所知,這個例子正好寫了我的代碼是如何通過佈局和佈局土地XML包含—片段。我甚至使用與我的主項目使用的ActionBarSherlock完全相同的版本構建該示例,並且保存實例狀態對於該示例來說工作正常。
如何在屏幕旋轉中保留片段狀態?爲什麼不叫onSaveInstanceState()
?
嘗試和@Override'onPause()'/'onResume()'。 – 2012-02-23 01:10:35
循環調用的順序是onPause(),onDestroy(),onCreate(),onCreateView(),onActivityCreated(),onResume()。 savedInstanceState始終爲空,並且從不調用onSaveInstanceState()。我很確定我不應該在任何地方顯式調用onSaveInstanceState()。 – George 2012-02-23 02:54:16
問題與在兩個不同的地方被引用的片段(肖像佈局vs風景佈局)有關嗎?也許這是向Android表明這些是不應該共享狀態的兩個不同片段? – George 2012-02-23 02:55:34