Navigation Componentで画面遷移に伴うデータのやり取りのうち、「次の画面」に渡す仕組みとしてSafe argsが用意されている。

逆に「前の画面」にデータを返すにはFragmentResultを利用する。

FragmentResultでデータを返す

FragmentResult

戻る処理の前にsetFragmentResultBundleオブジェクトをセットする。

setFragmentResult(リクエストキー, bundleOf(キー1 to 値1, キー2 to 値2, ・・・))

例えばあるボタンをクリックして戻るときは以下のようなコードを書く。

someButton.setOnClickListener {
  setFragmentResult("result", bundleOf("key1" to 1, "key2" to "foo"))
}

前画面のFragmentでデータを受け取る

前画面ではsetFragmentResultListenerで次画面にてセットしたFragmentResultを監視するリスナを登録することで受け取ることができる。

setFragmentResultListener(リクエストキー) { _, Bundleオブジェクト ->
  // Bundleオブジェクトから返された値を取り出して処理
}

setFragmentResultListenerの第1引数は次の画面のsetFragmentResultの引数で指定されたリクエストキーの文字列を指定する。

第2引数は受け取ったときに呼び出される無名関数を指定する。

例えば前掲のsetFragmentResultの例で返されるデータを受け取るには以下のようなコードとなる。

setFragmentResultListener("result") { _, bundle ->
  val value1 = bundle.getInt("key1")
  val value2 = bundle.getString("key2")
}