13
private static void changeFragment(Fragment f, boolean init) {
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.info_content, f,f.getClass().getName());
        if(!init){
            ft.addToBackStack(null);
        }
        ft.commit();
    }

fm.getBackStackEntryCount()を呼び出してスタックcoutを取得したい場合、ゼロを返しますか?

4

5 に答える 5

29

fm.executePendingTransactions()ft.commit()または前に呼び出す必要がありますfm.getBackStackEntryCount()。commit()は、後のパスのトランザクションのみをスケジュールするためです。

于 2013-01-15T16:45:07.457 に答える
19

私の場合、 getFragmentManager().getBackStackEntryCount() は常にゼロを返していました。

私の問題は、サポートフラグメントを使用していたことです:

Fragment fragment = new MyFragment();
// note getSupportFragmentManager() instead getFragmentManager()
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame, fragment)
.addToBackStack(null)
.commit();

fragmentManager.executePendingTransactions();

そして、常にゼロを返すgetFragmentManager() backStackEntryCountをチェックしました (別のフラグメント マネージャーを使用しています)。

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ) {
        getFragmentManager().popBackStack();            
    }
}

正しい数値を返すgetSupportFragmentManagerの代わりに:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0 ) {
        getSupportFragmentManager().popBackStack();         
    }
}

それが役に立てば幸い!

于 2015-08-17T08:23:00.013 に答える
4

別の解決策はFragmentManager.OnBackStackChangedListenerを使用することです

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount());
        }
});
于 2015-05-28T07:30:06.700 に答える