Why FragmentManager's getBackStackEntryCount() return zero?

后端 未结 5 1548
没有蜡笔的小新
没有蜡笔的小新 2020-12-10 13:01
private static void changeFragment(Fragment f, boolean init) {
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.info_content, f,f.getC         


        
相关标签:
5条回答
  • 2020-12-10 13:15

    It might be too late to answer this question. Hope this answer will help someone anyway.

    You should getBackStackEntryCount() method in onResume().

    It will be this:

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

    Good luck!

    0 讨论(0)
  • 2020-12-10 13:17

    Another solution is using FragmentManager.OnBackStackChangedListener

    fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount());
            }
    });
    
    0 讨论(0)
  • 2020-12-10 13:19

    It might be too late to answer this question. Hope this answer will help someone anyway.

    Mostly it depends on where you are actually calling getBackStackEntryCount() method. In my case, I was calling this method after calling super.onBackPressed(). The moment this method was got called, there was no fragment in back stack. That's why I was always receiving 0.

    Right way of calling the method in onBackPressed() :

       @Override
    public void onBackPressed() {
        try {
            int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
            Log.d("class", "items in backstack " + backStackEntryCount);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onBackPressed();
    }
    
    0 讨论(0)
  • 2020-12-10 13:27

    I had a similar problem, in my case getFragmentManager().getBackStackEntryCount() was always returning zero.

    My problem was I've using support fragments:

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

    and I've checking getFragmentManager() backStackEntryCount, which always returns zero (it's using another fragment manager):

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

    instead of getSupportFragmentManager, which returns the correct number:

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

    Hope it helps!

    0 讨论(0)
  • 2020-12-10 13:36

    You have to call a fm.executePendingTransactions() after ft.commit() or before fm.getBackStackEntryCount(). Because the commit() only schedules the transactions for a later pass.

    0 讨论(0)
提交回复
热议问题