現在、ContentPaneとActionBarPaneで構成されるレイアウトがあり、それぞれがのコンテナですFragment
。
各ContentPaneFragment
は、ファクトリメソッドを使用して独自のActionBarPaneをインスタンス化します。これにより、複雑なsFragment
を非常に簡単かつ迅速に開発できます。ActionBar
public void setFragment(Fragment fragment, String fragmentName) {
transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.dualPaneActionBar, fragment.getActionBar(this));
transaction.addToBackStack(null);
transaction.commit();
transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.dualPane, fragment);
transaction.addToBackStack(fragmentName);
transaction.commit();
}
これは素晴らしくうまく機能しますが、向きを変えた後のバックスタックのトラバースに関するバグに遭遇しました。
私の「戻る」実装は次のようになります。
public void goBack() {
if(getSupportFragmentManager().getBackStackEntryCount() > 2){
getSupportFragmentManager().popBackStackImmediate();
getSupportFragmentManager().popBackStackImmediate();
} else {
// Actually Exit
}
}
これはonBack()
、ContentPaneとそのActionBarの両方をはがします。
問題:Fragment Backstack
4つ以上(2つのContentPanesとそのActionBar)に到達し、方向を変更しても、 goBack()
2番目のActionBarはまだ存在します(の3番目Fragment
)Backstack
。
予想どおり、向きを変更しないと、正しいActionBar(Fragment
1)が表示されます。
ロギングでは、で4秒onBack()
から始まり、各「ポップ」が正常に呼び出され、残り2つだけになります(元のContentPaneとそのActionBar)。Fragment
Backstack
Fragments
前方および後方へのナビゲーションでは、ポップされたものではなく、元のActionBarが正しく使用されます。
オリエンテーション変更で添付されたフラグメントに発生するプロセスと、なぜこれがそのような奇妙な動作を引き起こすのかについて、誰かが知っていますか?
編集
for(int i =0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) {
Log.w("DualPaneActivity", getSupportFragmentManager().getBackStackEntryAt(i).getName());
}
getSupportFragmentManager().popBackStack();
getSupportFragmentManager().popBackStack();
getSupportFragmentManager().executePendingTransactions();
for(int i =0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) {
Log.w("DualPaneActivity", getSupportFragmentManager().getBackStackEntryAt(i).getName());
}
次と同義の出力を提供します。
Fragment1_actionbar,
Fragment1,
Fragment2_actionbar,
Fragment2,
Fragment1_actionbar,
Fragment1,
この出力は、正常な動作が存在する場合と誤った動作が存在する場合の両方で同じです...