web-dev-qa-db-fra.com

getBackStackEntryCount () renvoie toujours, même après avoir ajouté addToBackStack et executePendingTransactions ()

J'ai deux activités A et B. L'activité A a un mapFragment et je l'ajoute au backstack. Quand je reviens de l'activité B de l'activité B, je souhaite que le fragment apparaisse dans le même état que je l'ai laissé. Mais getFragmentManager (). GetBackStackEntryCount () me renvoie 0. Voici mon 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();

Quand je reviens de l'activité B, j'ai ce numéro à connaître pour getBackStackEntryCount ():

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

qui me montre 0.

Merci d'avance.

18
user3555350

J'ai eu un problème similaire, dans mon cas, getFragmentManager().getBackStackEntryCount() renvoyait toujours zéro.

Mon problème était que j'utilisais des fragments de support:

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

fragmentManager.executePendingTransactions();

et j'ai vérifié getFragmentManager()backStackEntryCount, qui renvoie toujours zéro (il utilise un autre gestionnaire de fragments):

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

au lieu de getSupportFragmentManager, qui renvoie le nombre correct:

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

J'ai le même problème. Grâce à cette réponse i crée le code ci-dessous dans mon activité, au lieu de fragment, et cette solution fonctionne correctement:

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

Essaye ça:

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

J'ai changé cette ligne:

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

pour ça:

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

Je suis sûr que si vous remplacez un fragment, il ne se trouve pas dans le stock.

1
apmartin1991

Le problème réside dans la manière dont vous ajoutez et supprimez des fragments. 

Si vous ajoutez avec supportFragmentManager , vous devez utiliser supportFragmentManager avec backStackEntryCount. 

Si vous utilisez fragmentManager pour ajouter, vous devez utiliser fragmentManager pour obtenir la quantité de 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
0
Jorge Casariego

google a obsolète getFragmentManager(), utilisez donc toujours getSupportFragmentManager() 

Vérifiez ici pour plus d'informations.

0
Shubham Sharma

J'ai une autre solution (marcher) pour détecter les fragments, car dans mon exemple, FM.getBackStackEntryCount () a également renvoyé 0 et FM.executPendingTransactions ne fonctionnait pas.

Alors voici comment j'ajoute un nouveau fragment:

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

Et voici comment je l'enlève:

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

Fondée à l'origine ici .

0
murt

Il suffit de remplacer getFragmentManager() par getSupportFragmentManager(). Solution simple. Cela fonctionne pour moi ... vous devez le faire lors de votre activité.

0
Mafujul