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.
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
À 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")
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
}
}
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 argType
s:
<argument
Android:name="data"
app:argType="string[]" />