AlertDialog にカスタムView を Compose レイアウト定義を使いたい

はじめに

Compose で用意されている AlertDialog の仕組みがダサすぎる
Web 系のアプリでよく見かけるダイアログの仕組みをまんま Compose で実装したものでダイアログを開く/閉じるの操作が全く受け入れられない
ならば、従来の View 系 AlertDialog の View を Compose で定義して使えたらいいなと思い試してみた

先に結論

ComposeView で view に変換するまではできるが Activity や Fragment が裏でやっている View のライフサイクルを ComposeView に伝搬させることができない理由で実行時エラーで落ちる
からと言って、親に Fragment を定義するとなると大げさすぎるし、そこまでして Compose を使いたいとも思わない

試したコード

    fun showComposeDialog(activity: Activity) {
        val composeView = ComposeView(activity).apply {
            setContent {
                Text("Hello, Compose!")
            }
        }

        val dialog = AlertDialog.Builder(activity)
            .setView(composeView)
            .setPositiveButton("OK") { dialog, _ ->
                dialog.dismiss()
            }
            .setPositiveButton("OK") { dialog, which ->
                dialog.dismiss()
            }
            .setNegativeButton("Cancel") { dialog, which ->
                dialog.dismiss()
            }
            .create()
        dialog.show()
    }

もちろん上のコードは実行時エラーで落ちるので使い物にならない
なんとかならないか?と思い試したが、結局エラーが出る

エラー内容

java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from android.widget.LinearLayout

まとめ

もともとの仕組みがダサく、応用して組み合わせる方法も裏の実装が不十分で実現不可能!
なんとも不満な結果で気に入らん

タイトルとURLをコピーしました