2012-11-30 33 views
1

這是我遇到的問題。我有一個活動A有一個片段F,它包含在FragmentPagerAdapter FPA中,在視圖V中。(A-> V-> FPA-> F)你可以在onDestroy()中分離一個片段嗎?

當A被破壞時(或在此情況,換出),F被附加,並在FPA中,這是在V.然而,當A被重新創建(例如有人點擊後退按鈕回到活動,例如),V和FPA不存在,所以F被重新創建(處於附加狀態!),但是對於不存在的東西,所以它不在視圖層次結構中。然後,當FPA試圖在這個片段上實例化狀態時,它會嘗試附加它,它什麼都不做,因爲它已經連接到了空氣中。

顯然有一些方法可以解決這個問題(例如,在活動的onCreate中存在V和FPA,以便片段在創建時可以到達某處),但是我想繼續懶洋洋地只在需要時才創造FPA和V.因此,似乎更新F的狀態以在onDestroy()中分離將是可取的。然而,state保存在onPause()中,這意味着我在這裏有點不走運。

有沒有辦法在A的onDestroy()中更新F的保存狀態?有沒有辦法說「如果活動被破壞,不要補充這個片段」?有沒有其他明顯的思考方式,我不考慮?感覺就像我在這裏以錯誤的方式處理事情。

回答

1

我有我的問題FragmentPagers。我所做的是在活動onCreate()中傳遞一個空包,然後在每次創建時從頭創建一切。像這樣:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); 
    // do my stuff 
} 

這種方式不會在重新創建活動時傳遞片段。

+0

噢 - 這是一個很好的資源trictive解決方案。絕對不適用於我的活動,該活動具有需要恢復的其他片段(不在FragmentPagerAdapter中)。 – secureboot

+0

爲了在使用此解決方案時仍然保留某些片段的狀態,我所做的是以編程方式將碎片狀態保存在Activity的狀態包中。在Activity的onSaveInstanceState()中,我調用Fragment的onSaveInstanceState()來允許Fragment將其狀態添加到Bundle中。在Activity的onCreate()中,我以編程方式創建並添加片段,然後將Bundle傳遞給Fragment.setArguments()。片段通過其onCreate()中的getArguments()從Bundle中檢索已保存的狀態,並忽略傳遞給其onCreate()的Bundle。 – Trevor

1

您寫道:

有沒有考慮這一點,我不會考慮其他一些明顯的方式?

這並不直接回答你的標題問題,但提供了一個方便的解決方案如何在ViewPager保存Fragment狀態。

您可以保存Fragment狀態時Activity被標記在ActivityFragment摧毀初始化Fragment

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.photos_pager_activity); 

    MyImageFragment fragment; 
    if (savedInstanceState != null) { 
     fragment = (MyImageFragment) getFragmentManager().findFragmentByTag("my_image_fragment_tag"); 
    } else { 
     fragment = new MyImageFragment(); 
     getFragmentManager().beginTransaction().add(android.R.id.content, fragment, "my_image_fragment_tag").commit(); 
    } 

參見:

Uses of fragment tags

ViewPager and fragments — what's the right way to store fragment's state?

+0

是的,但正如這些鏈接所解釋的那樣,如果您使用該標識,那麼ID和標記將由FragmentPagerAdapter設置。 – secureboot

+0

爲什麼你不能擁有FPA設置標籤? –

+0

不需要重寫大部分內容,FPA有一個makeFragmentName函數用於創建標記名稱,並將ID設置爲容器的ID。 – secureboot

相關問題