Je veux implémenter un comportement de contre-pression de telle sorte qu'il invite une fenêtre contextuelle de confirmation lorsque vous appuyez en arrière avec le backstack vide, sinon il affiche le fragment suivant dans la pile.
J'essaie d'obtenir le nombre de backstack, mais je reçois toujours 0 des deux gestionnaires de fragments
getSupportFragmentManager().getBackStackEntryCount();
getFragmentManager().getBackStackEntryCount();
Je suppose que cela devrait fonctionner puisque j'ai vérifié le code google du navigateur de fragments et qu'il ajoute à backstack via la transaction de fragment canonique:
FragmentNavigator.Java:
if (initialNavigation || isClearTask) {
backStackEffect = BACK_STACK_DESTINATION_ADDED;
} else if (isSingleTopReplacement) {
// Single Top means we only want one instance on the back stack
if (mBackStack.size() > 1) {
// If the Fragment to be replaced is on the FragmentManager's
// back stack, a simple replace() isn't enough so we
// remove it from the back stack and put our replacement
// on the back stack in its place
mFragmentManager.popBackStack();
ft.addToBackStack(Integer.toString(destId));
mIsPendingBackStackOperation = true;
}
backStackEffect = BACK_STACK_UNCHANGED;
} else {
ft.addToBackStack(Integer.toString(destId));
mIsPendingBackStackOperation = true;
backStackEffect = BACK_STACK_DESTINATION_ADDED;
}
ft.setReorderingAllowed(true);
ft.commit();
Je n'ai trouvé aucune API pour récupérer ces informations via NavController ou Navigator non plus.
Merci
Peut aussi aider quelqu'un:
<fragment
Android:id="@+id/YOUR_NAVIGATION_Host_ID"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/YOUR_NAVIGATION_Host" />
val navHostFragment = supportFragmentManager.findFragmentById(R.id.YOUR_NAVIGATION_Host_ID)
val backStackEntryCount = navHostFragment?.childFragmentManager?.backStackEntryCount
en utilisant la méthode addToBackStack () pendant la transaction, vous pouvez résoudre votre problème,
FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();
//You need to add the following line for this solution to work;
fragment.getView().setFocusableInTouchMode(true);
fragment.getView().requestFocus();
fragment.getView().setOnKeyListener( new OnKeyListener(){
@Override
public boolean onKey( View v, int keyCode, KeyEvent event )
{
if( keyCode == KeyEvent.KEYCODE_BACK )
{
return true;
}
return false;
}
} );
Pour vérifier le nombre de piles arrière d'un fragment d'hôte de navigation, vous devez utiliser childFragmentManager de navHostFragment:
navHostFragment.childFragmentManager.addOnBackStackChangedListener {
if (navHostFragment.childFragmentManager.backStackEntryCount == 0) {
// First fragment is open, backstack is empty
} else {
// there are fragments in backstack
}
}
Je comprends que la réponse est en retard. Mais peut-être que cela aidera quelqu'un d'autre.
val navHostFragment = supportFragmentManager.findFragmentById(R.id.navDrawerActivity)
val backStackEntryCount = navHostFragment?.childFragmentManager?.fragments?.size
<fragment
Android:id="@+id/navDrawerActivity"
Android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_item"
app:defaultNavHost="true"
/>