web-dev-qa-db-fra.com

Obtenez le statut Backstack en utilisant Android

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

11
Fabio

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
5
damienG

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;
   }
 } );
0
Mayur Dabhi

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
            }
        }
0
Ana Koridze

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"
/>
0
Sergii Suvorov