バックボタンでフラグメントが重なる問題

フラグメントA, B and Cがあり、バックボタンを押したときにBをskipしたいとする。
[A, B, C] (with Backbutton, [C,A])

BからCへの遷移時に
popBackStackImmediate()
を使うと容易に実現できる。FragmentManagerのメソッドだ。


まず、下のこのコードで基本的な遷移は実現できる。
addToBackStack()は、フラグメントではなく、何のフラグメントから何のフラグメントに遷移したかを覚えている。どうやら、引数はタグ名であり、nullだとタグ名を指定しないだけだ。下記のstackoverflowによれば.replace(A,B) は .add(B).remove(A) と同義だ。

// Display the next fragment

FragmentActivity fragmentActivity = (FragmentActivity) con;

FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.container, listViewFragment);

transaction.addToBackStack(null); //just changed the label, so do not store the old fragment

// Commit the transaction

transaction.commit();


当初は、[B,C]遷移時にaddToBackStack(null)を消去してみたところ、Bが表示される上、バックボタンを押すとBの上にAが表示される問題が起こった。そこで、[B,C]遷移時に
fragmentActivity.getSupportFragmentManager().popBackStackImmediate();
を追加したところ、バックスペースによる[C,B]遷移時に、瞬時にバックボタンのイベントがもう一度呼びだされ、[B,A]が実行されるようになった。

参考
http://stackoverflow.com/questions/14269350/how-to-keep-only-first-added-fragment-in-back-stack-fragment-overlapping






コメント