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

これは基本的にフラグメントコンテナを持つ1つのアクティビティです。いくつかのフラグメントがあり、ボタンを押すことによってお互いに動的に置き換えられます。 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内のすべての断片B及びCを追加するため

をfragmentA、fragmentB又はfragmentCのいずれかでコードを現在のフラグメントを置換する3つのボタンがあります

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(); 
まだ全て

我々は定義していない以外はほぼフラグメントAと同じです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すべて正常に機能します。バックスタックがクリアされ、onCreateViewおよびActivityCreatedがFragmentAで呼び出されます。

in 25.1.0何らかの形でフラグメントAに置き換えられた後、onCreateViewとActivityCreatedが2回呼び出されます。良くない。

が25.1.1でさらに悪化します。 fragmentAで置き換えた後、バックスタックのすべてのビューに対してonCreateViewとActivityCreatedが呼び出されます。今それは面白い権利:)

ちょうど私のサンプルアプリケーションを試して、logcatを見てください。その違いを確認するには、app.gradleファイルのサポートバージョンを変更してください。

誰かがこの問題を認識できると私はうれしく思います。そのため、この問題を克服したり解決する方法を見つけることができます。

+0

'Fragment'自体を' 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を比較して解決策を見つけました。 FragmentTransactionのsetAllowOptimizationメソッドを使用してみてください。

関連する問題