113

バックスタックに追加された最新のフラグメント インスタンスを取得するにはどうすればよいですか (フラグメント タグと ID がわからない場合)。

FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();

/****After add , replace fragments 
  (some of the fragments are add to backstack , some are not)***/

//HERE, How can I get the latest added fragment from backstack ??
4

17 に答える 17

161

getName()APIレベル14で導入されたメソッドを使用できFragmentManager.BackStackEntryます。このメソッドは、フラグメントをバックスタックに追加したときに使用したタグを返しますaddTobackStack(tag)

int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);

次のように、フラグメントをバックスタックに追加したことを確認する必要があります。

fragmentTransaction.addToBackStack(tag);
于 2012-03-20T13:38:02.167 に答える
49
FragmentManager.findFragmentById(fragmentsContainerId) 

関数は、バックスタックのトップへのリンクを返しますFragment。使用例:

    fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
            if(fr!=null){
                Log.e("fragment=", fr.getClass().getSimpleName());
            }
        }
    });
于 2014-04-05T13:13:41.423 に答える
43

私は個人的にこれらのソリューションの多くを試しましたが、最終的にはこの実用的なソリューションになりました。

バックスタック内のフラグメントの数を取得するために、以下で数回使用されるこのユーティリティ メソッドを追加します。

protected int getFragmentCount() {
    return getSupportFragmentManager().getBackStackEntryCount();
}

次に、FragmentTransaction メソッドを使用してフラグメントを追加/置換するときに、フラグメントに一意のタグを生成します (例: スタック内のフラグメントの数を使用して)。

getSupportFragmentManager().beginTransaction().add(yourContainerId, yourFragment, Integer.toString(getFragmentCount()));

最後に、次のメソッドを使用して、バックスタック内のフラグメントを見つけることができます。

private Fragment getFragmentAt(int index) {
    return getFragmentCount() > 0 ? getSupportFragmentManager().findFragmentByTag(Integer.toString(index)) : null;
}

したがって、バックスタックのトップ フラグメントをフェッチするには、次を呼び出すことで簡単に実現できます。

protected Fragment getCurrentFragment() {
    return getFragmentAt(getFragmentCount() - 1);
}

お役に立てれば!

于 2015-01-20T13:20:29.170 に答える
5

deepak goel によって与えられた答えは、私は常にから null を取得するため、うまくいきませentry.getName()

私がやっていることは、このようにタグをフラグメントに設定することです:

ft.add(R.id.fragment_container, fragmentIn, FRAGMENT_TAG);

ft はフラグメント トランザクションで、FRAGMENT_TAGはタグです。次に、このコードを使用してフラグメントを取得します。

Fragment prev_fragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);
于 2012-10-30T16:40:34.550 に答える
3

私を含め、多くの人が彼の方法を使用してnullを取得していたため、Deepak Goelの回答に何かを追加します。どうやら、バックスタックにフラグメントを追加するときにタグを機能させるには、次のようにする必要があります。

getSupportFragmentManager.beginTransaction().replace(R.id.container_id,FragmentName,TAG_NAME).addToBackStack(TAG_NAME).commit();

同じタグを 2 回追加する必要があります。

私はコメントしただろうが、私は50の評判を持っていない.

于 2020-03-11T09:56:10.243 に答える
3

getBackStackEntryAt()を使用できます。アクティビティがバックスタックに保持するエントリの数を知るには、getBackStackEntryCount()を使用できます。

int lastFragmentCount = getBackStackEntryCount() - 1;
于 2012-03-14T12:50:42.990 に答える
2

独自のバック スタックを保持する: myBackStack. Addへのフラグメントとして、FragmentManagerにも追加しmyBackStackます。長さが より大きいときonBackStackChanged()からポップします。myBackStackgetBackStackEntryCount

于 2014-08-15T08:31:14.473 に答える
0

または、コンテンツに対応するフラグメントを追加するときにタグを追加し、単純な静的文字列フィールドを使用して (onSaveInstanceState(Bundle) メソッドのアクティビティ インスタンス バンドルに保存することもできます)、最後に追加されたフラグメント タグを保持し、Tag() によってこのフラグメントを取得します。必要なときにいつでも...

于 2014-11-03T14:33:56.363 に答える