0
1

More than 1 year has passed since last update.

DialogFragmentをdismiss()するときに安全に値渡しする(setFragmentResultListenerを使用)

Last updated at Posted at 2021-06-24

setTargetFragment()が気付いたらdeprecated(非推奨)になっていたので書き換えよう・・・

と思い、調べてみたのですが思いのほか自作コールバックをしている記事ばかり:joy:

自作コールバックはやめたほうが良いです。
画面回転やbluetoothのオンオフなど、何かしらの設定変更をするとクラッシュしてしまったりするので。

というわけで、あれこれ調べていたら書き換える方法がわかったので共有します。

まずは呼び出し元に

ParentFragment.kt
   override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        this.childFragmentManager.setFragmentResultListener(
            RESULT_CODE,
            this,
            { requestKey, bundle ->
                // ここにコールバックされます
            })
    }

このように書きます。
注意するところは、childFragmentManagerを使うことです。
子fragmentにリスナーを設定するのでこっちです。

次に呼び出し元についてですが、

childDialogFragment.kt
    companion object {
        const val RESULT_CODE = "111"
    }

    override fun onCreate(savedInstanceState: Bundle?)) {
        viewModel.hoge.observe(this) {
            this.parentFragmentManager.setFragmentResult(RESULT_CODE, Bundle())
            dismiss()
        }
    }

ここでも注意ポイントはparentFragmentManagerを使うことです。
ここではBundle()をそのまま引数に渡していますが、もし何か他にも値を親にコールバックしたければよしなに設定してください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1