我目前有一个由ContentPane和ActionBarPane组成的布局,每个布局都是Fragment
的容器。
每个ContentPane Fragment
都使用Factory方法来实例化它自己的ActionBarPane Fragment
,从而可以轻松快速地开发复杂的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。
问题:当你到达4个或更多的Fragment Backstack
(2个ContentPanes及其ActionBars)并更改方向然后 {{1第二个ActionBar仍然存在(goBack()
中的第3个Fragment
)。
如果没有按预期更改方向,最终会显示正确的ActionBar(Backstack
1)。
记录显示Fragment
以onBack()
中的4 Fragment
开头,每个“pop”成功调用,最终只剩下2 Backstack
(原始的ContentPane和它的ActionBar)。
向前导航然后向后导航正确使用原始ActionBar,而不是弹出的那个。
是否有人知道在方向变更上附加碎片时发生的过程以及为什么会导致这种奇怪的行为?
修改
Fragments
将输出同义为:
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());
}
当出现正常行为时以及出现错误行为时,此输出相同...