私は、サポートライブラリからフラグメント付きアプリケーションを開発します。私は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を作成します。
- は3
- は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();
}
最初に考えたことでexecutePendingTransactions()またはこの特定のケースでの呼び出しのいずれかによって達成することができます:あなたはpopBackStackImmediate代わりのpopBackStackを試したことがありますか?違いは? –
ありがとう:)これは正しい解決策であるようです!たぶんあなたは答えとして投稿したいので、私はそれを受け入れることができます – Kryptur
確かに、私は別の答えとしてそれを再投稿します –