Подтвердить что ты не робот

Почему FragmentManager getBackStackEntryCount() возвращает ноль?

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();
    }

когда я хочу получить стек cout по вызову fm.getBackStackEntryCount(), он возвращает ноль?

4b9b3361

Ответ 1

Вам нужно позвонить fm.executePendingTransactions() после ft.commit() или до fm.getBackStackEntryCount(). Поскольку commit() только планирует транзакции для последующего прохода.

Ответ 2

У меня была аналогичная проблема, в моем случае 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();         
    }
}

Надеюсь, что это поможет!

Ответ 3

Возможно, слишком поздно ответить на этот вопрос. Надеюсь, этот ответ кому-то поможет.

В основном это зависит от того, где вы на самом деле вызываете метод getBackStackEntryCount(). В моем случае я вызывал этот метод после вызова super.onBackPressed(). В тот момент, когда этот метод был вызван, в заднем стекле не было фрагмента. Вот почему я всегда получал 0.

Правильный способ вызова метода в onBackPressed():

   @Override
public void onBackPressed() {
    try {
        int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
        Log.d("class", "items in backstack " + backStackEntryCount);
    } catch (Exception e) {
        e.printStackTrace();
    }
    super.onBackPressed();
}

Ответ 4

Другое решение использует FragmentManager.OnBackStackChangedListener

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount());
        }
});

Ответ 5

Возможно, слишком поздно ответить на этот вопрос. Надеюсь, что этот ответ кому-то поможет.

Вы должны получить методBackStackEntryCount() в onResume().

Это будет:

@Override
protected void onResume() {
    super.onResume();
    Log.i(TAG, "onResume: " + fragmentManager.getBackStackEntryCount());
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        Log.i(TAG, "Found fragment: " + fragmentManager.getBackStackEntryAt(entry).getId());
    }
}

Удачи!