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.
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();
}
}
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();
}
});
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.
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
google a obsolète getFragmentManager()
, utilisez donc toujours getSupportFragmentManager()
Vérifiez ici pour plus d'informations.
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 .
Il suffit de remplacer getFragmentManager()
par getSupportFragmentManager()
. Solution simple. Cela fonctionne pour moi ... vous devez le faire lors de votre activité.