44

MainActivityにListFragmentがあります。フラグメントオブジェクトを設定する方法は次のとおりです。

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new MyFragment();
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

問題は、ユーザーが戻るボタンを押したときに、少なくとも、を呼び出してアクションバーとメニューを変更する必要があることです。

getActionBar().setTitle(title);
getActionBar().setDisplayHomeAsUpEnabled(isEnabled);
invalidateOptionsMenu();

アクションバーの設定方法を知るために、現在どのようなフラグメントが表示されているかを知る必要があります。設定オプションを引数としてフラグメントに格納します。

String title = fragment.getArguments().getString("KEY_TITLE");
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED");

関連する質問を検索しましたが、次のように呼び出すことでフラグメントを取得できることに気付きました。

MyFragment fragment = (MyFragment) getSupportFragmentManager()
        .findFragmentByTag("tag");

ただし、すべてのタグをカスタムスタックに格納し、ユーザーがで戻るボタンを押すたびにpop()onBackPressed()を呼び出す必要があります。

だから、私の質問は、スタックから現在表示されているフラグメントを直接取得する方法はありますか?

注:MyFragmentだけでなく、フラグメントタイプも異なることに注意してください。

4

5 に答える 5

72

このようなものは、あなたの活動がバックプレスでこれを理解するのに役立つはずです:

private Fragment getCurrentFragment(){
    FragmentManager fragmentManager = getSupportFragmentManager();
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();
    Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag);
    return currentFragment;
}

@Override
public void onBackPressed() {
    Fragment fragmentBeforeBackPress = getCurrentFragment();
    // Perform the usual back action
    super.onBackPressed();
    Fragment fragmentAfterBackPress = getCurrentFragment();
}

お役に立てれば。

于 2013-02-22T16:31:32.157 に答える
36
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=", f.getClass().getSimpleName());
            }
        }
    });

編集: 2018年には、を返すgetFragmentsメソッドがあります。ドキュメントから:。したがって、そのリストから最後のフラグメントを取得できるようです。FragmentManagerList<Fragment>The order of the fragments in the list is the order in which they were added or attached

     List<Fragment> list = fragmentManager.getFragments();
     //get last one 
     Fragment topFragment = list.get(list.size() - 1);
于 2014-04-05T13:05:16.620 に答える
3

以下のコードは私にとって完璧に機能するため、何かが改善されたように見えますが、ここでも隣人の質問でも、すでに提供されている回答では見つかりませんでした。

Kotlin:

supportFragmentManager.fragments[supportFragmentManager.fragments.size - 1]

Java:

getSupportFragmentManager().getFragments()
.get(getSupportFragmentManager().getFragments().size() - 1)
于 2018-11-10T16:20:46.137 に答える
1

正解としてマークされた回答はすでにあり、私の追加情報はそれとそれほど変わらないでしょう。しかし、レシーバーを使用して、レシーバーの元のフラグメントがスタックの現在の最上位フラグメントであるかどうかを判断しようとすると、問題が発生しました。多くのNPEとインデックスの範囲外で簡単に実行できます。したがって、私はこれを書きました、多分それは誰かを助けます。

private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){
        FragmentManager fmManager = parentActivity.getFragmentManager();
        if(fmManager.getBackStackEntryCount() == 0){
            LOG.i("BackStack entry count is 0: " + this);
            return false;
        }
        String fragmentNameOnStackTop = "";
        final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1);
        if(topEntry != null) {
            fragmentNameOnStackTop = topEntry.getName();
        }
        LOG.d("Got fragments name: " + fragmentNameOnStackTop);
        return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false;
    }

これは、いくつかのフラグメントを持つアクティビティに対しては正常に機能することに注意してください。ViewPagerをchildfragmentmanagerを使用している場合は注意してください。

そして、fragmentNameをに設定することを忘れないでくださいFragmentTransaction.addToBackStack(fragmentName)

于 2014-08-28T11:32:35.630 に答える
1

このヘルパーメソッドは、スタックの最上位からフラグメントを取得します。

public Fragment getTopFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}
于 2017-10-17T07:06:38.760 に答える