3

打破由於支持版本25.1.0和最新的25.1.1我得到片段替換/添加奇怪的行爲。 已報告的問題25.1.0 Android - fragmentTransaction.replace() not works on support library 25.1.0片段popbackstack行爲25.1.0和25.1.1

但是現在在25.1.1中我遇到了類似的問題。要重現行爲我創建樣例應用程序,你可以找到在https://github.com/holoduke/fragmenttest

它基本上是一個活動與片段容器。有幾個片段可以通過按下按鈕來動態替換。我們從mainActivity本身添加FragmentA開始。

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentA(); 
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

一切正常工作正常。在這兩個25.0.1,25.1.0和25.1.1 fragmentA

現在有3個按鈕,這將所有與任一fragmentA,fragmentB替換當前片段或fragmentC

用於添加片段B和C的代碼是幾乎相同片段A除了我們還沒有定義:

fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

當片段B或C中加入執行以下代碼:

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentB(); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

儘管如此所有在25.0.1,25.1.0和25.1.1都很好。 如果您多次添加fragmentB和C,則fm.getBackStackEntryCount()會增加。那很好。

現在怪異的部分。 我們想用popStackImmediate添加FragmentA(清除歷史記錄) 這裏兩個3支持版本的行爲都很瘋狂。

比方說,你在所有3個版本執行以下bavhiour:

  1. 開始應用
  2. 替換B片段
  3. 與C片段取代
  4. 與B片段取代
  5. 更換與片段C
  6. 替換片段A

in 25.0.1一切正常。堆棧被清除,並在FragmentA中調用onCreateView和ActivityCreated。

在25.1.0與FragmentA的onCreateView和ActivityCreated更換後以某種方式被稱爲2次。不好。

在25.1.1其更糟。在用fragmentA替換後,對於後臺堆棧中的所有視圖,都會調用onCreateView和ActivityCreated。現在,那是可笑吧:)

試試看我的示例應用程序,並期待在logcat中。更改app.gradle文件中的支持版本以查看差異。

我會很高興,如果有人能夠認識到這個問題爲好,這樣我們可以找到一種方法來克服或解決,即使這個問題。

+0

你是從片段本身取代'Fragment'嗎?如果這樣使用'getChildFragmentManager()' - 只需要澄清。 –

+0

不從MainActivity替換它。看到https://github.com/holoduke/fragmenttest/blob/master/app/src/main/java/com/test/fragment/gillis/testfragment/MainActivity.java –

+1

我確認,當彈出到更深的碎片堆棧之間的所有片段都有其在25.1.1中調用的onCreateView。這已經打破了我的應用程序運行良好,直到更新到25.1.1。降級到25.1.0解決了我的問題。不過,我的替換方式如A-> B-> C-> D,這與您的示例不同,所以我可能沒有遇到您在第25.1.0節中提到的問題。 –

回答

4

那麼,我面臨同樣的問題,並通過比較25.0.1 - > 25.1.1 FragmentManager.class找到了解決方案。嘗試使用setAllowOptimization FragmentTransaction的方法。

相關問題