3

我目前有一个由 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();
}

虽然这工作得非常好,但我遇到了一个关于在方向更改后遍历 backstack 的错误。

我的“后退”实现如下所示:

public void goBack() {
    if(getSupportFragmentManager().getBackStackEntryCount() > 2){
        getSupportFragmentManager().popBackStackImmediate();
        getSupportFragmentManager().popBackStackImmediate();            
    } else {
        // Actually Exit
    }
}

其中,onBack()剥离了 ContentPane 和 ActionBar。

问题:当您达到Fragment Backstack4 个或更多(2 个 ContentPanes 及其 ActionBars)并更改方向 goBack(),第二个 ActionBar 仍然存在(第 3 个Fragment在 中Backstack)。

如预期的那样,如果没有方向更改,您最终会显示正确的 ActionBar ( Fragment1)。

记录显示,onBack()从 4Fragment秒开始Backstack,每个“pop”都被成功调用,最终只剩下 2 个Fragments(原始的 ContentPane 和它的 ActionBar)。

向前和向后导航正确使用原始的 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,

当出现正常行为以及出现不正确行为时,此输出是相同的......

4

0 回答 0