Est-il possible de passer et d'accéder à des arguments dans un fragment en utilisant une vue de navigation inférieure et le composant Navigation?
J'utilise une seule activité avec de nombreux fragments où mon fragment de niveau supérieur nécessite un argument (généralement effectué via la méthode générée par newInstance). J'ai jeté un œil au guide du développeur du composant Navigation et au codelab, mais il ne mentionne que l'utilisation de safeargs et l'ajout de balises d'argument dans les destinations et les actions.
Voici mon graphique de navigation:
<navigation xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
app:startDestination="@id/homeFragment">
<fragment Android:id="@+id/homeFragment"
Android:name="uk.co.homeready.homeready.HomeFragment"
Android:label="fragment_home"
tools:layout="@layout/fragment_home">
<!--Do I create an argument block here?-->
</fragment>
<fragment Android:id="@+id/calculatorFragment"
Android:name="uk.co.homeready.homeready.CalculatorFragment"
Android:label="fragment_calculator"
tools:layout="@layout/fragment_calculator"/>
<fragment Android:id="@+id/resourcesFragment"
Android:name="uk.co.homeready.homeready.ResourcesFragment"
Android:label="fragment_resources"
tools:layout="@layout/fragment_resources"/>
</navigation>
Menu d'affichage de navigation inférieur:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:id="@+id/homeFragment"
Android:icon="@drawable/ic_home_black_24dp"
Android:title="@string/title_home"/>
<item
Android:id="@+id/calculatorFragment"
Android:icon="@drawable/ic_baseline_attach_money_24px"
Android:title="@string/title_calculator"/>
<item
Android:id="@+id/resourcesFragment"
Android:icon="@drawable/ic_baseline_library_books_24px"
Android:title="@string/title_resources"/>
</menu>
Activité principale:
override fun onCreate(savedInstanceState: Bundle?) {
...
val navController = Navigation.findNavController(this,
R.id.nav_Host_fragment)
bottom_navigation.setupWithNavController(navController)
....
}
activity_main.xml
<Android.support.constraint.ConstraintLayout>
<fragment
Android:id="@+id/nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"/>
<Android.support.design.widget.BottomNavigationView
Android:id="@+id/bottom_navigation"
app:menu="@menu/bottom_navigation"/>
</Android.support.constraint.ConstraintLayout>
AccueilFragment
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val argument = //TODO access argument here
...
}
Les valeurs par défaut n'étaient pas utilisables pour moi, car j'ai des éléments de menu dynamiques qui pourraient avoir plusieurs de la même destination avec des arguments différents. (changé depuis le serveur)
Implémentez BottomNavigationView.OnNavigationItemSelectedListener:
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val fragmentId = item.itemId
val arguments = argumentsByFragmentId[fragmentId] // custom mutableMapOf<Int, Bundle?>() with arguments
navController().navigate(fragmentId, arguments)
return true
}
Pour l'utiliser, vous reprendrez la navigation, en remplaçant l'écouteur. L'ordre des appels ici est important:
bottomNavigationView.setupWithNavController(navController)
bottomNavigationView.setOnNavigationItemSelectedListener(this)