web-dev-qa-db-fra.com

Composant d'architecture de navigation - Passage des données d'argument à startDestination

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?

17

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)

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
14
Elliot Schrock

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.

2
HvSimon

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.

0
Dr. aNdRO