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
?
j'ai aussi rencontré le même problème,
Voici comment je l'ai résolu:
your_activity.xml
: C'est-à-dire supprimer app: navGraph = "@ navigation/nav_graphVoici à 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"
/>
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
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(...)
}
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é.
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)
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