バックボタンを押したとき、ネストしたFragmentをバックスタックする方法
FragmentからFragmentを呼ぶ(いわゆるNested Fragment)場合、バックボタンを押したとき、一個前のFragmentに戻したいときがあります。
stackoverflowでいいものを見つけたので、備忘録としてメモしておきます。
Android 4.2: back stack behaviour with nested fragments - Stack Overflow
Fragment呼び出し時
当たり前のことなのですが、Fragment呼び出し時は後で復元できるようにaddToBackStackを呼んでスタック*1に追加しておきます。
@Override public void onCreate(Bundle savedInstanceState){ logger.put(android.util.Log.INFO,TAG,"onCreate"); super.onCreate(savedInstanceState); DataListFragment list = DataListFragment.newInstance(1,new DataListListener(){ @Override public void onSwitchToNextFragment(){ DetailFragment fragment = DetailFragment.newInstance(1); getChildFragmentManager().beginTransaction() .replace(R.id.container, fragment) .addToBackStack(null) .commit(); } }); getChildFragmentManager().beginTransaction() .add(R.id.container, list) .commit(); }
バックボタンを押したときの処理
以下のようにしてNetsted Fragmentのスタックが存在する場合は、popBackStackを呼んで1つ前の状態の戻しします。
@Override public void onBackPressed() { // if there is a fragment and the back stack of this fragment is not empty, // then emulate 'onBackPressed' behaviour, because in default, it is not working FragmentManager fm = getSupportFragmentManager(); for (Fragment frag : fm.getFragments()) { if (frag.isVisible()) { FragmentManager childFm = frag.getChildFragmentManager(); if (childFm.getBackStackEntryCount() > 0) { childFm.popBackStack(); return; } } } super.onBackPressed(); }
statckoverflowに感謝、感謝です。