J'ai une activité A qui démarre l'activité B en lui transmettant des données d'intention. Activité B Hébergez un graphique de navigation à partir du nouveau composant Architecture de navigation. Je souhaite transmettre ces données d'intention au fragment startDestination en tant qu'argument. Comment procéder?
TLDR: Vous devez gonfler manuellement le graphique, ajouter les clés/valeurs aux defaultArgs et définir le graphique sur la variable navController
.
Étape 1
La documentation vous indique de définir le graphique dans la balise <fragment>
dans la présentation de votre Activity
. Quelque chose comme:
<fragment
Android:id="@+id/navFragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
app:graph="@navigation/nav_whatever"
app:defaultNavHost="true"
/>
SUPPRIME la ligne avec le graph=
.
Étape 2
Dans l'activité qui affichera votre NavHostFragment
, gonflez le graphique comme suit:
val navHostFragment = navFragment as NavHostFragment
val inflater = navHostFragment.navController.navInflater
val graph = inflater.inflate(R.navigation.nav_whatever)
Où navFragment
est l'id que vous avez donné à votre fragment en XML, comme ci-dessus.
Étape 3 [Crucial!]
Créez un bundle pour contenir les arguments que vous voulez transmettre à votre fragment startDestination
et ajoutez-le aux arguments par défaut du graphique:
val bundle = Bundle()
// ...add keys and values
graph.addDefaultArguments(bundle)
Étape 4
Définissez le graphique dans la variable navController
de l'hôte:
navHostFragment.navController.graph = graph
Cela avait été corrigé dans 1.0.0-alpha07
. Voir détail.
La solution est similaire à celle d'Elliot Schrock, mais elle est enveloppée par une API officielle.
Nous devons gonfler manuellement NavHostFragment
ou graph
Utilisation
NavHostFragment.create(R.navigation.graph, args)
Ou
navController.setGraph(R.navigation.graph, args)
Args sont les données que nous voulons transmettre pour démarrer la destination.
Donc, pour les gens qui luttent encore avec cela. J'ai trouvé un autre moyen de faire cela sans utiliser Safe-Args et une étape en utilisant la réponse de @ Elliot.
Supposons donc que vous ayez reçu des arguments dans l'activité B de l'activité A et que votre activité B comporte un fragment startDestination lors de l'initialisation du contrôleur de navigation comme suit:
navController = Navigation.findNavController(this, R.id.detailFragment);
À partir du contrôleur de navigation, vous aurez accès à votre graphique que vous avez défini dans le code XML comme ceci et vous pouvez définir les arguments dans les arguments par défaut:
navController.getGraph().addDefaultArguments(extras);
Note: Ceci mettra également à jour les valeurs des clés s'il est déjà présent dans le graphe xml
Maintenant, dans votre fragment, vous devez trouver les arguments par défaut de votre NavHostFragment comme ceci:
Bundle defaultArguments = NavHostFragment.findNavController(this).getGraph().getDefaultArguments();
et vous aurez les valeurs là-bas. Je ne sais pas pourquoi @Elliot pense que c'est crucial mais que ça devrait être comme ça?
UPDATE alpha09: L'argument addDefault n'est plus pris en charge dans cette version, vous devez utiliser NavArgument.