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(). Простое решение. Это работает для меня. Вам нужно сделать это на своем мероприятии