2012-02-23 71 views
13

我有一個具有自己的狀態(選定的按鈕等)的片段。屏幕旋轉時狀態丟失。爲什麼不調用我的片段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()

+0

嘗試和@Override'onPause()'/'onResume()'。 – 2012-02-23 01:10:35

+1

循環調用的順序是onPause(),onDestroy(),onCreate(),onCreateView(),onActivityCreated(),onResume()。 savedInstanceState始終爲空,並且從不調用onSaveInstanceState()。我很確定我不應該在任何地方顯式調用onSaveInstanceState()。 – George 2012-02-23 02:54:16

+0

問題與在兩個不同的地方被引用的片段(肖像佈局vs風景佈局)有關嗎?也許這是向Android表明這些是不應該共享狀態的兩個不同片段? – George 2012-02-23 02:55:34

回答

23

您可以啓用myFragment.setRetainInstance(true)來保留狀態,但它會自動執行此操作,即它會保留分配給您的類成員的值並且不使用onSaveInstanceState(因此savedInstanceState始終爲null)。

確保承載此片段的FragmentActivity不會覆蓋onSaveInstanceState,或者它應該調用super.onSaveInstanceState(Bundle)

+4

Arg,這麼簡單!我沒有在我的Activity中調用'super.onSaveInstanceState()'。感謝埃裏克的回答,我正在把我的頭髮撕掉...... – George 2012-02-23 22:24:44

0

如果片段在旋轉時需要不同的佈局資源,則不能使用setRetainInstance(true)。此page顯示setRetainInstance(true)的片段的生命週期。

最初的想法是使用onSaveInstanceState()保留所有成員數據,就像常規活動一樣。但是,由於某種原因,onSaveInstanceState()未被調用。但是FragmentActivity是正確的,正如@Eric Kok所建議的)。我發現的最佳解決方案是使用片段的參數

查看solution通過Fyodor Volchyok,很簡單。就像onSaveInstanceState()中的outState和onViewCreated()中的savedInstanceState一樣。

相關問題