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:
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!
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)
.
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).
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"
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())