渡すのはとても簡単です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>
コンパイル時の安全性といくつかの利便性が必要になるため、タイプセーフな方法を使用することをお勧めします。
このライブラリは、引数のクラスMyDestinationArgs
を構築します。これを使用してBundle
を構築し、この方法で結果を宛先に渡すことができます
val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args)
受信側では、引数クラスを使用してデータを取得することもできます
val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode
Bundle
内でもデータを渡すことができます。追加したとしましょう
const val ARG_TEMPLATE_CODE = "templateCode"
DetailFragment
のcompanion 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)