2013-08-19 55 views
2

我有以下問題。我試圖在配置更改時保留我的一個片段的佈局。所以我想,我可以使用setRetainInstance(true)。然而,事實證明,這並不奏效。問題是,onCreateView每次在配置更改時被調用,以便我的佈局被重置爲初始狀態。如何在配置更改的Android片段中保留我的佈局?

我能做些什麼來保護我的佈局? 我需要在onCreateView以內的其他地方移動我的代碼嗎?

請注意:I 不能因爲我的標籤託管活動託管更多選項卡,因此請在清單中使用hack並使用android:configChanges="orientation"。我只想保留一個選項卡中的狀態。

下面是我的一些代碼:

public class MyFragment extends SherlockFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    setRetainInstance(true); 
    View rootView = inflater.inflate(R.layout.abc, container, false); 

    // Some more code that was omitted .. 

    return rootView; 
} 
} 
+0

您不應該在* visible *片段上使用'setRetainInstance()',因爲如果擁有的活動被重新創建,您將泄漏對之前活動的引用。 –

+0

@AlexMDC和我該怎麼做才能保留我的佈局可見碎片? – user2426316

+0

即使片段是與擁有活動一起重新創建的,您所描述的內容也應自動工作。如果你刪除了'setRetainInstance()'調用,並讓片段恢復到默認行爲,會發生什麼?視圖恢復時佈局有何不正確? –

回答

0

你調用一個事情「黑客」其實真的不是... android:configChanges="orientation"在您的清單中簡單地告訴了Android框架,而不是方向上的默認行爲更改(正在關閉並重新啓動您的應用程序,導致您的Fragment中的onCreateView()也被調用),您將在您的應用程序中自行處理方向更改。

它不做(當然)是實現你想要的行爲(即保持你的選項卡的佈局不變)。這將不得不自己完成,例如將所有其他佈局替換爲特定的縱向/橫向佈局,但不要改變特定的標籤。您在Activity的回調中實現此行爲,順便說一句,只有在清單中設置android:configChanges後纔會調用該行爲。

+0

你讀過這篇文章http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html?他將其描述爲一種hacky – user2426316

+0

在鏈接到它的文章中被描述爲hacky,因爲在這種情況下,您將使用configchanges清單屬性來防止應用程序銷燬/創建循環以維護某些通用應用程序狀態。 configchanges屬性只應用於設計的情況,這是對http://developer.android.com/reference/android/R.attr.html#configChanges中描述的屬性的更改。這包括對屏幕方向的更改。 – baske

+0

從你的評論到你原來的問題:請注意你的問題要求保留你的佈局的方法。它沒有提到任何有關保留表格數據的內容,從您的評論中判斷是您的實際目標。在這種情況下,我會說:確保您正確實施onSaveInstanceState(),並在應用程序重新初始化時重新加載數據,就像Alex在他的評論中所述的那樣。從性能角度來看,保留佈局有時是有益的,但與正確處理數據持久性無關! – baske

相關問題