web-dev-qa-db-fra.com

Comment désactiver UP dans Navigation pour certains fragments avec le nouveau composant Architecture de navigation?

J'essaie le nouveau Composant d'architecture de navigation , et je n'arrive pas à comprendre comment faire ceci:

J'ai 1 activité (activité principale) + 3 fragments:

  • SplashFragment (Accueil)
  • MainFragment
  • SignUpFragment

J'aimerais utiliser SplashFragment pour déterminer si je dois naviguer vers MainFragment ou SignUpFragment, mais une fois qu'il atteint l'une de ces deux options, vous ne devriez plus pouvoir revenir à SplashFragment. Comment puis-je faire cela avec le nouveau composant de navigation? 

J'ai essayé popBackStack avant et après avoir appelé navigate(R.id.action_xxx), mais aucun d'entre eux ne fonctionne (ce qui a du sens: avant qu'il n'ait rien à afficher, après avoir simplement fermé le fragment qui vient d'être ajouté). Cela signifie-t-il que la seule façon de faire est de remplacer onBackPress pour l'intercepter et de s'assurer que navigateUp ne reçoit pas d'appel dans ces cas?

Merci!

7
Louis Tsai

Tout d'abord, ajoutez les attributs app:popUpTo='your_nav_graph_id' et app:popUpToInclusive="true" à la balise d'action.

<fragment
    Android:id="@+id/signInFragment"
    Android:name="com.glee.incog2.Android.fragment.SignInFragment"
    Android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        Android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>

Deuxièmement, accédez à la destination en utilisant l'action ci-dessus comme paramètre.

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

NOTE: Si vous utilisez la méthode navigate(@IdRes int resId), vous n'obtiendrez pas le résultat souhaité. Par conséquent, j'ai utilisé la méthode navigate(@NonNull NavDirections directions).

4
Subhojit Shaw

AVERTISSEMENT: clearTask est obsolète et sera supprimé dans une version ultérieure, ne sachant pas quelle est la solution. Veuillez suivre ce numéro pour le moment pour vous tenir au courant


Oh, après 10 minutes, a finalement trouvé la clé: utilisez clearTask

Tout ce que je dois faire est d’ajouter app:clearTask="true" à cette action spécifique ou d’utiliser .navigate(R.id.actionXXXX, null, NavOptions.Builder().setClearTask(true).build()) et c’est fait. Assurez-vous simplement de l'ajouter à tous les enfants de SplashFragment (dans ce cas, MainFragment et SignUpFragment).

7
Louis Tsai

Cela a fonctionné pour moi dans la version alpha05. Ajoutez app: popUpTo = "@ id/nav_graph" dans la balise d'action (dans votre fichier nav_graph.xml) . Ici "@ id/nav_graph est l'identifiant de mon graphe ou aussi appelé racine.

<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/nav_graph"
app:startDestination="@id/startFragment">
.......
<action
Android:id="@+id/action_startFragment_to_homeFragment"
app:destination="@id/homeFragment" 
app:popUpTo="@id/nav_graph"/>
.......

Vous pouvez également le faire dans l'onglet Conception: - sélectionnez "SplashFragment" et sélectionnez l'action que vous souhaitez modifier, puis sélectionnez "racine" pour "Pop To"

4
Akii

Pour ceux qui veulent le faire purement en code:

Navigation.findNavController(v)
.navigate(R.id.action_splashFragment_to_userProfileFragment2, null, 
new NavOptions.Builder().setPopUpTo(R.id.splashFragment, true).build())
0
Broak