Ответ 1
Вам нужно позвонить fm.executePendingTransactions()
после ft.commit()
или до fm.getBackStackEntryCount()
. Поскольку commit() только планирует транзакции для последующего прохода.
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(), он возвращает ноль?
Вам нужно позвонить fm.executePendingTransactions()
после ft.commit()
или до fm.getBackStackEntryCount()
. Поскольку commit() только планирует транзакции для последующего прохода.
У меня была аналогичная проблема, в моем случае 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();
}
}
Надеюсь, что это поможет!
Возможно, слишком поздно ответить на этот вопрос. Надеюсь, этот ответ кому-то поможет.
В основном это зависит от того, где вы на самом деле вызываете метод 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();
}
Другое решение использует FragmentManager.OnBackStackChangedListener
fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount());
}
});
Возможно, слишком поздно ответить на этот вопрос. Надеюсь, что этот ответ кому-то поможет.
Вы должны получить метод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());
}
}
Удачи!