nullパラメータを持つaddToBackStackの意味は何ですか?


94

顧客コードを持っています。すべてのフラグメントに対して1つのアクティビティしかありません。つまり、単一のアクティビティがすべてのフラグメントを管理しています。

このアクティビティには、フラグメントのメソッドの最後にあるフラグメントの次のコードが含まれています

例えば-MoreFragmentのフラグメント:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

そう、

1)にaddToBackStack(null)続くの意味は何commit()ですか?

2)nullパラメータを渡す必要があるのはなぜaddToBackStackですか?

3)このように追加された後にそのフラグメントを取得するにはどうすればよいですか?

私は最後の行なしでコードを実行し、.addToBackStack(null).commit()問題なく実行されたので、このコードは役に立たないようです。


developer.android.com/reference/android/app/… 場合によっては、そのメソッドを呼び出す必要があります。
Lucifer


3
Nullの代わりにフラグメント名をパラメーターとしてaddToBackStack(name)に渡すことができます。Nullを渡すと、メソッドFragmentManager.popBackStackImmediate(String name、int flags);を使用できなくなります。またはpopBackStack(String name、int flags); 名前がNullだったからです。したがって、popBackstackメソッドは機能しません。nullを渡す代わりに、フラグメント名をパラメーターとして渡すことをお勧めします。
ラッキールケイン2016年

回答:


112

addToBackStack(null)の後にcommit()が続く意味は何ですか?

引用文書:

addToBackStack()を呼び出すと、置換トランザクションがバックスタックに保存されるため、ユーザーはトランザクションを元に戻し、[戻る]ボタンを押すことで前のフラグメントに戻すことができます。

トランザクションに複数の変更(別のadd()やremove()など)を追加してaddToBackStack()を呼び出すと、commit()を呼び出す前に適用されたすべての変更が単一のトランザクションと[戻る]ボタンとしてバックスタックに追加されます。それらを一緒に逆にします。

FragmentTransactionに変更を追加する順序は、以下を除いて重要ではありません。

電話する必要があります commit()最後に。同じコンテナに複数のフラグメントを追加する場合は、フラグメントを追加する順序によって、ビュー階層に表示される順序が決まります。

だから、最後にコミットする必要があります。

addToBackStackにnullパラメータを渡す必要があるのはなぜですか?

nullである必要はなく、文字列でもかまいません。必要ない場合は、nullを渡してください。

パブリック抽象FragmentTransaction addToBackStack(文字列名)

APIレベル11で追加このトランザクションをバックスタックに追加します。これは、トランザクションがコミットされた後に記憶され、後でスタックからポップされたときにその操作を元に戻すことを意味します。

パラメータnameこのバックスタック状態のオプションの名前、またはnull。

について:

最後の行.addToBackStack(null).commit()なしでコードを実行し、問題なく実行されたので、このコードは役に立たないようです

前のフラグメントに移動する場合は、バックスタックに追加します。したがって、フラグメントをバックスタックに追加するかどうかによって異なります。

このように追加された後にそのフラグメントを取得するにはどうすればよいですか?

あなたはすでにフラグメントインスタンスを持っています firstFragment。後でフラグメントを取得することで何を意味するのかわかりません。

詳しくは @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


これをAPIドキュメントから回答に追加することもできます:このトランザクションをバックスタックに追加します。これは、トランザクションがコミットされた後に記憶され、後でスタックからポップされたときにその操作を元に戻すことを意味します。パラメータnameこのバックスタック状態のオプションの名前、またはnull。
Dyrborg 2014

私が理解したように、バックスタックに追加する全体の目的は、前のフラグメントに移動するために戻るボタンで行うようにナビゲーションを実行することです?
私の神

わかりましたので、パラメーターをaddToBackStackに渡すgetFragmentManager().popBackStackImmediate()場合、[戻る]ボタンがパラメーターパスの有無にかかわらずそれ自体でそれを実行できる場合はなぜ必要なのでしょうか。-stackoverflow.com/questions/21156153/…
私の神

@VedPrakash必要はありません。また、それはまったく異なる質問と回答です。あなたは簡単にバックスタックに追加し、戻るボタンを押すと二つの断片を持つことで自分自身を見つけることができます
Raghunandan

@VedPrakash読み取り管理フラグメント@ developer.android.com/guide/components/fragments.html
Raghunandan

17

tag文字列はaddToBackStack(String name)、後でその場所に直接ポップするためにバックスタックを見つける方法を提供します。それはメソッドで使用されることを意味しましたpopToBackStack(String name, int flags)

マネージャーのフラグメントバックスタックから最後のフラグメント遷移をポップします。この関数は非同期です-ポップするリクエストをキューに入れますが、アプリケーションがそのイベントループに戻るまでアクションは実行されません。

name:null以外の場合、これは検索する前のバック状態の名前です。見つかった場合、その状態までのすべての状態がポップされます。POP_BACK_STACK_INCLUSIVEフラグを使用して、名前付き状態自体をポップするかどうかを制御できます。nullの場合、トップ状態のみがポップされます。

フラグ:0またはPOP_BACK_STACK_INCLUSIVE。

つまり、namein によって追加されたフラグメントが見つかるまで、バックスタックをポップしますaddToBackStack(String name)

たとえば、フラグメントマネージャーに一連の追加または置換を行って「frag1」、「frag2」、「frag3」、「frag4」という名前を付け、後でaddToBackStack()で追加されたフラグメント2に直接戻りたい場合frag2 ")を呼び出しますpopToBackStack("frag2", 0)

そう、

  • 使用.addToBackStack("fragName"):後でpopToBackStack(String name, int flags)複数のバックスタックをポップしたい場合。

  • 使用.addToBackStack(null):後で複数のバックスタックをポップしたくないが、一度に1つずつポップしたい場合。popToBackStack()を明示的に呼び出さなくても、これを実行してください。代わりに、バックプレスのデフォルト実装にバックスタックを処理させます。

  • 使用.disallowAddToBackStack():バックプレスが不要な場合、またはpopBackStack()を明示的に呼び出さない場合。コードのどの部分も.addToBackStack()を使用していないことを確認します。


1

回答は非推奨です。バックスタックにフラグメントを追加したくない場合は、以下のコードスニペットを使用する必要があります。

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

以下にそれを使用するかわいい例があります:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
どこで廃止されましたか?ドキュメントやFragmentTransactionソースに何も表示されません。
Rup

3
もしあなたがそうであるならdisallowAddToBackStack、その後addToBackStackを呼び出すとIllegalStateExceptionがスローされる
Kathir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.