2016-03-02 159 views
1

我有一個活動ActivityA和3個片段FragmentA,FragmentBFragmentC屏幕旋轉後不顯示片段

要添加FragmentA,我用replace,其中fragmentFragmentA一個新的實例:

getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.frame_layout_fragment, fragment) 
     .commit(); 

在ActivityA的onCreate方法,我做了檢查FragmentA創作:

if (savedInstanceState == null) { 
    FragmentA fragmentA = FragmentA.newInstance(); 

    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.frame_layout_fragment, fragmentA) 
      .commit(); 
} 

要添加FragmentBFragmentC,我使用addaddToBackStack,其中fragment是新實例的FragmentBFragmentC

getSupportFragmentManager() 
     .beginTransaction() 
     .add(R.id.frame_layout_fragment, fragment) 
     .addToBackStack(null) 
     .commit(); 

我按後退按鈕,同時FragmentC,它顯示FragmentB,並按下返回鍵,而在FragmentB顯示FragmentA,符合市場預期。當我在FragmentC,我旋轉設備,並且FragmentC仍然顯示,如預期。

然而,當我使用2個按壓後退按鈕從FragmentC導航到FragmentA,然後兩次旋轉設備,肖像 - >風景 - >肖像,添加FragmentB,添加FragmentC,然後我一次旋轉設備,我預計FragmentC來顯示,而是FragmentB顯示。當我按下後退按鈕一次,沒有任何反應。當我再次按下它時,它將導航回FragmentA。看起來好像FragmentC出現在背面堆疊中,但由於某種原因它不可見。

爲什麼FragmentC在這種情況下不可見?

回答

1

我覺得這個回答另一個問題是你的答案太:Difference between add(), replace(), and addToBackStack()

它說:添加和更換之間

還有一個重要的區別:更換 刪除現有的片段,並增加了一個新的分段。這意味着當 你按下返回按鈕時,被取代的片段將被創建 並調用其onCreateView。而添加保留了現有的 片段,並添加了一個新片段,這意味着現有片段將爲 活動,並且它們不會處於「已暫停」狀態,因此當後退按鈕爲 時,按下onCreateView不會調用現有片段( 片段在添加新片段之前是在那裏)。在 片段的生命週期事件onPause,onResume,onCreateView和其他 生命週期事件將在替換的情況下被調用,但它們不會被添加時調用 。

+0

旋轉設備調用onCreateView爲我的情況下的每個片段。即使調用了onCreateView,FragmentC也不會顯示。 – catsfw