web-dev-qa-db-ja.com

ナビゲーションタイプsafeargsプラグインを使用してParcelableタイプのオブジェクトをフラグメントに渡す方法

ナビゲーションアーキテクチャコンポーネントを使用するようにシンプルなUIアプリを書き換えています。Parcelableを実装するPojoを渡す必要がありますが、その方法に関するドキュメントはありません。

任意の助けをいただければ幸いです。

13
Jerry Okafor

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

21
Marius

現在、integerstringinferredおよびreferenceissue があり、他のタイプを要求しています。

ここでできることは、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")
7
Levi Moreira

私は答えがすでにあることを知っていますが、これは誰かを助けるかもしれません。 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


   }

}
4
Suyash Chavan

booleanreferenceintegerlongstringenumparcelable、さらには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 { ... }

そして、すべてのargTypesの配列を送信できます。

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