web-dev-qa-db-fra.com

Comment passer des arguments à un fragment en utilisant la vue de navigation inférieure et Android Composant de navigation?

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
    ...
}
13
skon

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)
0
Morten Holmgaard