getBackStackEntryCount() always returns 0 even after adding addToBackStack and executePendingTransactions()

瘦欲@ 提交于 2019-12-09 14:06:26

问题


I have two activities A and B. Activity A has a mapFragment and I am adding it to backstack. When I come back from to Actvity A from B, I want the fragment to show up in same state as I left it. But getFragmentManager().getBackStackEntryCount() is returning me 0. Here is my code:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.replace(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

When coming back from activity B, I have this to know number of getBackStackEntryCount():

System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());

which is showing me 0.

Thanks in advance.


回答1:


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



回答2:


I has similar problem. Thanks to this answer i create below code in my activity, instead of fragment, and this solution work fine:

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:


Try this:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.add(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

I have changed this line:

fragmentTransaction.replac(R.id.container, mMapFragment);

to this:

fragmentTransaction.add(R.id.container, mMapFragment);

Pretty sure if you replace a fragment then its not in the backstack :)




回答4:


I have another solution (walk around) to detect Fragments, because in my example FM.getBackStackEntryCount() also returned 0 and FM.executPendingTransactions didn't work.

So here is how I add a new fragment:

getFragmentManager().beginTransaction()
                        .add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
                        .setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
                        .commit();

And here is how i remove it:

Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
        if(prevTool != null){
            getFragmentManager().beginTransaction().remove(prevTool).commit();
        }else {
            intentCANCELED();
        }

Orginally founded here.




回答5:


Just replace getFragmentManager() with getSupportFragmentManager() . Simple solution. It's working for me. You need to do it on your Activity




回答6:


The problem lies in how you're adding and removing fragments.

If you are adding using supportFragmentManager you must use supportFragmentManager with backStackEntryCount.

If you use fragmentManager to add then you should use fragmentManager to get the amount of fragments (backStackEntryCount)

// **Kotlin**
// AddFragment
val ft = supportFragmentManager.beginTransaction()
ft.replace(R.id.activity_base_content, f)
ft.addToBackStack(null)
ft.commit()

// Get amount of fragments 
supportFragmentManager.backStackEntryCount



回答7:


google has deprecated getFragmentManager(), so always use getSupportFragmentManager()

Check Here for more information.



来源:https://stackoverflow.com/questions/29148542/getbackstackentrycount-always-returns-0-even-after-adding-addtobackstack-and-e

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!