web-dev-qa-db-fra.com

Android Composant d'architecture de navigation: comment passer des données de bundle à startDestination

J'ai une activité qui a un NavHostFragment. L'activité reçoit certaines valeurs dans son intention. Je veux transmettre ces données au premier fragment, c'est-à-dire startDestination du graphique de navigation. Je n'ai trouvé aucune documentation à ce sujet.

J'ai déjà traversé cette question sur SO mais je n'arrive pas à trouver la méthode addDefaultArguments pour navController.getGraph().

Est-il possible de passer le bundle à startDestination?

9
Praveen Singh

j'ai aussi rencontré le même problème,

Voici comment je l'ai résolu:

  1. Supprimer la configuration xml de NavHostFragment de your_activity.xml: C'est-à-dire supprimer app: navGraph = "@ navigation/nav_graph

Voici à quoi devrait ressembler votre XML.

        <fragment
        Android:id="@+id/nav_Host"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:defaultNavHost="true"
        />
  1. Ajouter Configuration de NavHostFragment par programme dans onCreate() d'activité. Et passer des données de bundle en utilisant NavGraph.addDefaultArguments(bundleData) api

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.editor_layout)
            setupNavigation()
        }
    
        private fun setupNavigation() {
            val navHostFragment = nav_Host as NavHostFragment
            val navController = navHostFragment.navController
            val navInflater = navController.navInflater
            val graph = navInflater.inflate(R.navigation.nav_graph)
            graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination 
            navHostFragment.navController.graph = graph
        }
    

MISE À JOUR:

Dépendances dans mon fichier Project Gradle:

dependencies {

    def nav_version = "1.0.0-alpha08"

    implementation "Android.Arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "Android.Arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin}
}

REMARQUE: Dans la version du composant de navigation 1.0.0-alpha09 Pour une raison quelconque, google n'a pas de méthode car addDefaultArguments() pourrait être corrigé bientôt. Mais les versions inférieures ont la méthode addDefaultArguments(). J'ai vérifié les deux Java et kotlin alors essayez d'utiliser 1.0.0-alpha07 Ou 1.0.0-alpha08

1
Anmol

Je ne trouve pas non plus cette méthode. Il n'existe pas dans la documentation des composants d'architecture.

Mais c'est une autre façon de définir des arguments sur la destination de départ:

// Kotlin Code, in Fragment
with(findNavController().graph) {
    get(startDestination).addArgument(...)
}
0
the_dani

J'ai vérifié le code source et vu qu'il y avait beaucoup de changements concernant la destination de navigation et les arguments. Je pense que la bonne façon de passer des arguments pour démarrer la destination est d'utiliser la méthode 'addArgument', quelque chose comme ceci:

val argument1 = 1 //First value
val argument2 = "Value" //Second value
val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
navController.getGraph().addArgument("Key1",navArgument1)
navController.getGraph().addArgument("Key2",navArgument2)

Il y a peut-être une meilleure façon, mais je n'en ai pas trouvé.

0
Alex

Navigation 1.0.0

        val navHostFragment = root_nav_Host_fragment as NavHostFragment
        val navController = navHostFragment.navController
        val navInflater = navController.navInflater
        val graph = navInflater.inflate(R.navigation.navigation)
        val sectionId = intent.getIntExtra(KEY_SECTION_ID, -1)
        val bundle = bundleOf(KEY_SECTION_ID to sectionId)
        navHostFragment.navController.setGraph(graph, bundle)
0
Ken Zira
class MainActivity : BaseActivity()  {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment = container as NavHostFragment
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(R.navigation.main_nav)

        var data : Data  = intent.getParcelableExtra("DATA") as Data
        var bundle : Bundle = Bundle()
        bundle.putParcelable("DATA", data)
        graph.addDefaultArguments(bundle)
        graph.addDefaultArguments(intent!!.extras!!)
        navHostFragment.navController.graph = graph

    }
}

Ajoutez le code ci-dessus dans Activity pour envoyer les données à l'aide de la navigation

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        var data = NavHostFragment.findNavController(this).graph.defaultArguments.getParcelable("DATA") as Booking

}

Ajoutez le code ci-dessus côté fragment

0
Vinil Chandran