2012-06-05 43 views
3

我正在使用片段創建片劑優化的應用程序。我在左邊有一個薄的導航片段,並帶有按鈕來控制哪些片段將被加載到佔據屏幕其餘部分的兩個ViewGroup容器中。例如,如果按下導航片段中的按鈕,第一個容器將加載項目列表片段(例如,用於設置,客戶等),第二個容器將加載片段以顯示項目詳細信息。如何在定位更改的內存中保留片段

因爲我想保留片段在內存中(所以,當從設置導航到客戶,然後回到設置,以前的設置片段應該在那裏,所以用戶不會失去他們的位置) - 我創建片段實例變量的活動

SettingsListFragment settingsListFragment; 
SettingsDetailFragment settingsDetailFragment; 
CustomerListFragment customerListFragment; 
CustomerDetailFragment customerDetailFragment; 

然後我創建這些片段時neccessary並根據需要與碎片更換容器。例如。

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
if(settingsListFragment == null){ 
    settingsListFragment = new SettingsListFragment(); 
}   

fragmentTransaction.replace(R.id.fragment_container_left, settingsListFragment); 
fragmentTransaction.commit(); 

我的問題是,我怎樣才能保留這些實例的方向變化?

我假設我不應該使用的活動onRetainNonConfigurationInstance()方法根據 http://developer.android.com/resources/articles/faster-screen-orientation-change.html,因爲「要非常小心你通過onRetainNonConfigurationChange(對象)......這意味着你永遠不應該通過一個視圖,一個可繪製的,一個適配器等「

我也試圖從片段管理器獲得片段, Fragment clf = fragmentManager.findFragmentByTag("CLIENT LIST"); 但它回來爲空。我認爲它在片段被替換後被釋放。

感謝您的任何幫助/建議。

回答

3

你不能(或實際上不應該)以這種方式保留片段。我猜這是你想要保持的狀態。

如果您將狀態存儲在onSaveInstanceState()中,稍後可以在onCreate()onActivityCreate()中檢索它。所以在你回去之後(你必須將FragmentTransaction添加到後退堆棧中),你可以從你保存的Bundle中恢復狀態!

FragmentManager將負責處理配置更改並在當前視圖中恢復您的片段。

3

我建議讓android重繪您的對象。 如果你想保持方向改變的數據,你應該保留在服務組件中。這樣數據在方向改變時不會丟失。

否則你總是可以做到這一點:

把這個在您的清單

<activity android:configChanges="orientation|keyboardHidden"></activity> 

放thisin您的活動類

使用這種方法,您的活動將不會被重繪時
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 
} 

,所以當您使用獨立的XML佈局文件進行橫向或縱向定位時,您的佈局將不會進行調整

1

還有一件事,您可以通過FragmentManager#putFragmentFragmentManager#getFragment檢索存儲的片段參考。

相關問題