14

これは、バックスタックにフラグメントを追加する機能です。

public void populateContent(File f)
{

    ContentFragment cf = new ContentFragment(ctx, ac, this);
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();;
    cf.updateView(f);

    transaction.replace(R.id.contentFragment, cf);

    transaction.addToBackStack(null);

    transaction.commit();

}

戻るボタンをクリックしても、最後のフラグメントがロードされません(何も起こりません)。

これを引き起こしている可能性のあるアイデアはありますか?

編集:FragmentManagerログ。

http://pastebin.com/mYnVdkLG

私のアプリケーションは、最初のビューを保存してから2番目のビューを保存するのではなく、2番目のビューを2回保存しているように見えます。

4

3 に答える 3

54

フラグメントトランザクションでaddToBackStack()を呼び出すだけでは不十分なようです。自分で[戻る]ボタンを押すと、バックスタックのポップアップを処理する必要があります。これをアクティビティに追加すると、期待どおりに機能しました。

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
于 2014-10-28T03:29:40.900 に答える
12

実際の解決策についてはわかりませんが、少しガイドすることができ、おそらく問題が何であるかを理解することができます。

実際に2つのフラグメントを置き換えていますか?そうしないと、元に戻すトランザクションはありません。また、最初FragmentにXMLから追加されましたか?マネージャはこのフラグメントについて認識しないためFragment、トランザクションを使用して最初のフラグメントを追加する必要がある場合もあります。

確認するように注意してください。if (savedInstanceState == null) performFirstTransaction()そうしないと、最初の2回を追加することになりますFragment

1つの良いアイデアはで使用enableDebugLoggingすることFragmentManagerです。これにより、マネージャーが知っているフラグメントがわかります。

これを参照してください: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

ちなみに、にカスタムコンストラクタを使用することはお勧めしませんFragment。これは、アプリがOSによって強制終了されて再インスタンス化されると、空のコンストラクターが呼び出されるためです。

ContentFragment.getInstance(<params>)を作成するなどの静的メソッドを使用する必要がありますFragment

詳細については、http://developer.android.com/reference/android/app/Fragment.htmlの「ClassOverview」セクションを参照してください。

私の答えが問題を見つけるのに少し役立つことを願っています。

于 2013-02-11T06:43:29.783 に答える
2

置き換えではなく追加していましたが、add()の前ではなく、閉じたままのフラグメントではなく、閉じたままのフラグメントでaddToBackStack(null)を呼び出す必要がありました。

クラスA(最初にオープン)

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();

クラスB(クラスAによって開かれた)

FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
于 2015-02-19T16:19:03.820 に答える