GetBackStackEntryCount() всегда возвращает 0 даже после добавления addToBackStack и executePendingTransactions()
У меня есть два действия A и B. Активность A имеет mapFragment, и я добавляю его в backstack. Когда я вернусь из Actvity A из B, я хочу, чтобы фрагмент отображался в том же состоянии, в котором я его оставил. Но getFragmentManager(). GetBackStackEntryCount() возвращает мне 0. Вот мой код:
MapFragment mMapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
mMapFragment.getMapAsync(this);
fragmentTransaction.replace(R.id.container, mMapFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
getFragmentManager().executePendingTransactions();
Возвращаясь из активности B, мне нужно знать число getBackStackEntryCount():
System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());
который показывает мне 0.
Спасибо заранее.
Ответы
Ответ 1
У меня была аналогичная проблема, в моем случае 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();
}
}
Ответ 2
У меня схожая проблема. Благодаря этому ответу я создаю ниже код в своей деятельности, а не фрагмент, и это решение работает нормально:
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.d("ovech", "back stack changed");
Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount());
if(getSupportFragmentManager().getBackStackEntryCount()>0) {
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);
} else {
toolbar.setNavigationIcon(null);
Log.d("ovech", "hello without icon");
}
toolbar.invalidate();
}
});
Ответ 3
Попробуйте следующее:
MapFragment mMapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
mMapFragment.getMapAsync(this);
fragmentTransaction.add(R.id.container, mMapFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
getFragmentManager().executePendingTransactions();
Я изменил эту строку:
fragmentTransaction.replac(R.id.container, mMapFragment);
:
fragmentTransaction.add(R.id.container, mMapFragment);
Довольно уверен, что если вы замените фрагмент, то его нет в задней части:)
Ответ 4
У меня есть другое решение (прогулка), чтобы обнаружить фрагменты, потому что в моем примере FM.getBackStackEntryCount() также возвращался 0, а FM.executPendingTransactions не работал.
Итак, вот как я добавляю новый фрагмент:
getFragmentManager().beginTransaction()
.add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
.setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
.commit();
И вот как я его удаляю:
Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
if(prevTool != null){
getFragmentManager().beginTransaction().remove(prevTool).commit();
}else {
intentCANCELED();
}
Основано здесь.
Ответ 5
Просто замените getFragmentManager()
на getSupportFragmentManager()
. Простое решение. Это работает для меня.
Вам нужно сделать это на своем мероприятии