3

現在、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番目FragmentBackstack

予想どおり、向きを変更しないと、正しいActionBar(Fragment1)が表示されます。

ロギングでは、で4秒onBack()から始まり、各「ポップ」が正常に呼び出され、残り2つだけになります(元のContentPaneとそのActionBar)。FragmentBackstackFragments

前方および後方へのナビゲーションでは、ポップされたものではなく、元の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