web-dev-qa-db-fra.com

Comment passer un objet de type Parcelable à un fragment en utilisant le plugin safeargs de type Navigation

Je suis en train de réécrire mon application d'interface utilisateur simple pour utiliser le composant d'architecture de navigation, je dois passer un Pojo qui implémente Parcelable, je n'ai pas vu de documentation sur la façon de le faire.

Toute aide serait appréciée.

8
Po10cio

Depuis safe-args-gradle-plugin:1.0.0-alpha03, vous pouvez utiliser des objets Parcelable en utilisant leur nom de classe complet: 

app:argType="com.example.app.model.Item"

Les arguments pouvant être parcellisés sont maintenant supportés, en utilisant un nom de classe complet pour app: type. La seule valeur par défaut prise en charge est "@null" ( - https://issuetracker.google.com/issues/79563966 ).

Source: https://developer.Android.com/jetpack/docs/release-notes

15
Marius

À l'heure actuelle, vous ne pouvez pas utiliser d'arguments sécurisés avec des types autres que integer, string, inferred et reference. Un issue est ouvert et demande d'autres types.

Ce que vous pouvez faire maintenant est de passer normalement un bundle lorsque vous utilisez la méthode browse () pour naviguer vers une destination:

var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)

Et vous pouvez utiliser la variable getArguments habituelle (ou seulement des arguments dans kotlin) pour récupérer cela:

val tv = view.findViewById(R.id.textViewAmount)
tv.text = arguments.getString("amount")
5
Levi Moreira

Je sais que la réponse est déjà là, mais cela peut aider quelqu'un. Code snippet 

Dans build.gradle, ajoutez cette dépendance 

ext{
     ...
     navigation_version = '1.0.0-alpha11'
}
dependencies {
     ...
     classpath "Android.Arch.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
}

Dans app/build.gradle

apply plugin: 'androidx.navigation.safeargs'
...

Dans le graphique de navigation


 <fragment
            Android:id="@+id/source_fragment_id"
            Android:name="app.test.SourceFragment"
            Android:label="@string/source_fragment_label"
            tools:layout="@layout/source_fragment_layout">

         <action
                Android:id="@+id/action_source_fragment_to_destination_fragment"
                app:destination="@id/destination_fragment_id"
                ...
                />


</fragment>

<fragment
            Android:id="@+id/destination_fragment_id"
            Android:name="app.test.DestinationFragment"
            Android:label="@string/destination_fragment_label"
            tools:layout="@layout/destination_fragment_layout">

        <argument
                Android:name="variableName"
                app:argType="app.test.data.model.CustomModel" />

        ...

</fragment>

Remarque: CustomModel doit être colis ou sérialisable.

Lors de la navigation vers ce DestinationFragment à partir de SourceFragment

val direction = SourceFragmentDirections.ActionSourceFragmentToDestinationFragment(customModel)
findNavController().navigate(direction)

Récupérer maintenant la valeur de bundle dans DestinationFragment

...
import app.test.DestinationFragmentArgs.fromBundle

class DestinationFragment : Fragment() {
   val variableName by lazy {
       fromBundle(arguments!!).variableName
   }

   ...
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.e(DESTINATION_FRAGMENT_TAG,"onCreateView")

        //Can use CustomModel variable here i.e. variableName


   }

}
1
Suyash Chavan

Vous pouvez utiliser boolean, reference, integer, long, string, enum, parcelable et même serializable Mais oubliez le dernier ;-)

Mieux vaut utiliser la dernière version du plugin safe-args-gradle-plugin:1.0.0-alpha08 et spécifier le nom de classe complet:

<fragment
    ...>
    <argument
        Android:name="data"
        app:argType="com.example.ParcelableData" />
</fragment>

de ton

package com.example

data class ParcelableData(val content: String) : Parcelable { ... }

Et vous pouvez envoyer des tableaux de tous les argTypes:

<argument
        Android:name="data"
        app:argType="string[]" />
0
sbo3000