ナビゲーションアーキテクチャコンポーネントを使用するようにシンプルなUIアプリを書き換えています。Parcelableを実装するPojoを渡す必要がありますが、その方法に関するドキュメントはありません。
任意の助けをいただければ幸いです。
safe-args-gradle-plugin:1.0.0-alpha03
完全修飾クラス名を使用して、Parcelable
オブジェクトを使用できます。
app:argType="com.example.app.model.Item"
App:typeに完全修飾クラス名を使用して、パーセル可能な引数がサポートされるようになりました。サポートされているデフォルト値は「@null」のみです( https://issuetracker.google.com/issues/79563966 )
ソース: https://developer.Android.com/jetpack/docs/release-notes
現在、integer、string、inferredおよびreference、 issue があり、他のタイプを要求しています。
ここでできることは、navigate()メソッドを使用して目的地に移動するときに、通常bundleを渡すことです。
var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)
そして、通常のgetArguments
(またはkotlinの単なる引数)を使用してそれを取得できます:
val tv = view.findViewById(R.id.textViewAmount)
tv.text = arguments.getString("amount")
私は答えがすでにあることを知っていますが、これは誰かを助けるかもしれません。 Code snippet
Build.gradleにこの依存関係を追加します
ext{
...
navigation_version = '1.0.0-alpha11'
}
dependencies {
...
classpath "Android.Arch.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
}
App/build.gradleで
apply plugin: 'androidx.navigation.safeargs'
...
ナビゲーショングラフで
<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>
注:CustomModelはParcelableまたはSerializableである必要があります。
SourceFragmentからこのDestinationFragmentに移動するとき
val direction = SourceFragmentDirections.ActionSourceFragmentToDestinationFragment(customModel)
findNavController().navigate(direction)
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
}
}
boolean
、reference
、integer
、long
、string
、enum
、parcelable
、さらにはserializable
を使用できます。しかし、最後のものを忘れてください;-)
最新のプラグインバージョンsafe-args-gradle-plugin:1.0.0-alpha08
および完全修飾クラス名を指定します。
<fragment
...>
<argument
Android:name="data"
app:argType="com.example.ParcelableData" />
</fragment>
あなたから
package com.example
data class ParcelableData(val content: String) : Parcelable { ... }
そして、すべてのargType
sの配列を送信できます。
<argument
Android:name="data"
app:argType="string[]" />