Fragmentに値を渡す

Fragmentに値を渡す時は、Bundleを使って渡します。Fragmentのインスタンスを生成するstaticなメソッドを作るのは良くあるパターンだと思いますが、この時にFragmentのargumentsにBundleをセットします。

companion object {
    private const val ARG_TEXT = "arg_text"

    fun newInstance(text: String) = MainFragment()
        .apply {
            arguments = Bundle().apply {
                putString(ARG_TEXT, text)
            }
        }
}

Bundleから値を取り出す時は、 by lazy の中で取り出すのが個人的には気に入っています。

private val text: String by lazy {
    arguments?.getString(ARG_TEXT) ?: ""
}

※ (2021/11/12追記)必ずFragmentに値が渡ってくるのであれば、 arguments の代わりに requireArguments が使える気がする。つまり、 requireArguments().getString(ARG_TEXT) というように書ける。

まとめ

class MainFragment : Fragment() {

    private val text: String by lazy {
        arguments?.getString(ARG_TEXT) ?: ""
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(
            R.layout.fragment_main,
            container,
            false
        )
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?
    ) {
        super.onViewCreated(view, savedInstanceState)

        textView.text = text
    }

    companion object {
        private const val ARG_TEXT = "arg_text"

        fun newInstance(text: String) = MainFragment()
            .apply {
                arguments = Bundle().apply {
                    putString(ARG_TEXT, text)
                }
            }
    }
}

筆者

茨城県つくば市在住のソフトウェアエンジニアです。得意領域はAndroidとFlutterです。「Jetpack ComposeによるAndroid MVVMアーキテクチャ入門」の著者です。

👉もっと詳しく