iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Kotlin】Fragment のイベントを Activity で受け取る

本日も初歩的な内容ですが、Fragment のイベントを Activity で受け取る実装を行ったので、その方法をメモ程度に残しておきます🏃🏻‍♂️

それではやっていく

Fragment 側の実装は下記のようになります。重要な部分は OnboardSignUpTermsOfServiceListener に関するところで、Activity に通知したいイベントを Interface として定義しています。OnboardSignUpTermsOfServiceListenerインスタンス化は、FragmentonAttach() メソッドで行います。onAttach() メソッドは Fragment が Activity に追加される時 に呼び出され、引数として追加する Activity がキャストされて渡されます。また、FragmentActivity から関連付けられなくなった場合にイベントが通知され続けるのを防ぐため onDetach() でリスナーを破棄しています。

class OnboardSignUpTermsOfServiceFragment : Fragment() {

    interface OnboardSignUpTermsOfServiceListener {
        fun onClickNext()
    }

    private var _binding: FragmentOnboardSignUpTermsOfServiceBinding? = null
    private val binding get() = _binding!!
    private var listener: OnboardSignUpTermsOfServiceListener? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentOnboardSignUpTermsOfServiceBinding.inflate(inflater, container, false)

        binding.nextButton.setOnClickListener {
            onClickNext(it)
        }

        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? OnboardSignUpTermsOfServiceListener
        if (listener == null) {
            throw ClassCastException("$context must implement OnboardSignUpTermsOfServiceListener")
        }
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }

    fun onClickNext(view: View) {
        listener?.onClickNext()
    }
}

最後に Activity 側で Interface に準拠することでイベントを受け取れるようになります。

class OnboardSignUpActivity : AppCompatActivity(),
    OnboardSignUpTermsOfServiceFragment.OnboardSignUpTermsOfServiceListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_onboard_sign_up)
    }

    // MARK: OnboardSignUpTermsOfServiceListener
    override fun onClickNext() {
        // TODO: Handle events.
    }
}

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com