web-dev-qa-db-ja.com

フラグメントに移動するときにsafe-argsを渡します

渡すのはとても簡単ですsafe-argsアクションを介して navigation を使用する場合(directionsクラスを使用)。しかし、渡す方法safe-argsナビゲーションを使用して直接フラグメント化する場合は?

navController?.navigate(R.id.detailFragment)

nav_graph:

<fragment
    Android:id="@+id/detailFragment"
    Android:name="com.example.ui.main.detail.DetailFragment"
    Android:label=" "
    tools:layout="@layout/detail_fragment" >
    <argument
        Android:name="templateCode"
        app:argType="string" />
    <action
        Android:id="@+id/action_start_guide"
        app:destination="@id/fillInfoFragment" />
</fragment>
4
Francis

コンパイル時の安全性といくつかの利便性が必要になるため、タイプセーフな方法を使用することをお勧めします。

このライブラリは、引数のクラスMyDestinationArgsを構築します。これを使用してBundleを構築し、この方法で結果を宛先に渡すことができます

val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args) 

受信側では、引数クラスを使用してデータを取得することもできます

val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode

季節によってはsafeargsライブラリを使用できない場合

Bundle内でもデータを渡すことができます。追加したとしましょう

const val ARG_TEMPLATE_CODE = "templateCode"

DetailFragmentcompanion objectの定数(Javaのstatic finalフィールド)

これで、データを渡すことができます

val args = Bundle()
args.putString(DetailFragment.ARG_TEMPLATE_CODE, "some_code")
navController?.navigate(R.id.confirmationAction, args)

レシーバーフラグメントは、引数からデータを取得できます。

arguments?.getString(ARG_TEMPLATE_CODE)

または、ターゲットの宛先がActivityの場合、インテントエクストラからデータを取得できます(宛先アクティビティからARG_TEMPLATE_CODE定数になります)

intent?.extras?.getString(ARG_TEMPLATE_CODE)

ドキュメントで詳細を読む ここ および ここ

9
XIII-th