2016-12-29 8 views
1

私は、サポートライブラリからフラグメント付きアプリケーションを開発します。私は1つのアクティビティしか使用しません。 レイアウトは、コラプスツールバーレイアウトとナビゲーションビューを備えたコーディネーターレイアウトで構成されています。 私はNavigationItemSelectedListenerで次のコマンドを実行ナビゲーションアイテムを選択:新しい項目を選択するときにonResumeは "死んだ"フラグメントを呼びます - 正しく回復するには?

switch (item.getItemId()) { 
       default: 
        return false; 
       case R.id.mainmenu_start: 
        navi.clear(); 
        navi.navigate(new StartFragment(), R.id.fragment_container); 
        return true; 
       // ... More menu entries 
      } 

は、だから私はbackstack(navi.clear())をクリアし、新しいものに表示された断片を置換。

私が抱えている問題は次のとおりです。「古い」(置き換えられた)フラグメントは削除/切り離されません

私はStartFragmentに移動したときにそう、その後、別のフラグメントに移動し、再びStartFragmentを選択し、onResumeは二回呼び出されます:一度、新しく作成された1の「古い」/第一StartFragment、上一度

この現象を回避するにはどうすればよいですか? またはは、既存のフラグメントを再利用したいのですが、両方とも大量の問題を引き起こします...

この現象を調べるために、各フラグメントに一意の(増分)IDを付けました。新しいフラグメントに移動すると、onResumeはいくつかの古いフラグメントで呼び出されますが、すべてのフラグメントでは呼び出されません。
例:私はいつも同じメニュー項目を選択してナビゲートします。これは、数はフラグメントID(すべての断片が同じクラス(StartFragment)されている)を示し、 "イベント" occuring、以下のとおりです。

    を再開し、1を再開し、2作成を再開し、1を作成します。
  1. は3
  2. は4

だから時々 "古い" の断片が不足していると、後で戻ってくる再開、3を再開し、2を再開し、4を作成して再開、1を再開、3を作成します。 onResumeは時々完全に異なるフラグメントでも呼び出されます。

public void clear() { 
    FragmentManager fragmentManager = ((MainActivity)context).getSupportFragmentManager(); 
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 



public void navigate(Fragment fragment, int container, HashMap<String, Pair<String, View>> sharedElements) { 
    this.hideKeyboard(); 
    FragmentTransaction ft = ((MainActivity)context).getSupportFragmentManager().beginTransaction(); 
    ft.replace(container, fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 
    ((MainActivity)context).getDrawerLayout().closeDrawers(); 
} 
+1

最初に考えたことでexecutePendingTransactions()またはこの特定のケースでの呼び出しのいずれかによって達成することができます:あなたはpopBackStackImmediate代わりのpopBackStackを試したことがありますか?違いは? –

+1

ありがとう:)これは正しい解決策であるようです!たぶんあなたは答えとして投稿したいので、私はそれを受け入れることができます – Kryptur

+0

確かに、私は別の答えとしてそれを再投稿します –

答えて

1

投稿:完全性については


ナビゲーション機能を(だから私は...新しいフラグメント1を作成するときに、以前、フラグメント2のonResumeとも呼ばれるフラグメント2を開いたとき)将来の参照のための答え。

私はあなたの問題は、popBackStack()はすぐに効果がないが、次のイベントループパスで実行するようにスケジュールされていると思います。あなたのケースでは遅すぎて望ましくない効果が生じます。どのような助けが必要なのかは、断片的なマネージャーのトランザクションを強制的に終了させることです。

それはpopBackStackImmediate()

関連する問題