🐻‍❄️

Jetpack Compose の AndroidView で WebView を利用する

2021/11/13に公開

はじめに

Jetpack Compose で WebView を使いたいのであれば AndroidView を利用して WebView を生成する必要がある。AndroidView を利用した WebView の生成方法について少し調べたのでまとめる。

セットアップ

本記事では以下の環境で動作確認をしています。

  • Kotlin v1.5.21
  • Jetpack Compose v1.0.1
  • Android Studio Bublebee | 2021.1.1 Canary 7

AndroidView とは

Jetpack Compose では AndroidView というコンポーザブルが用意されている。AndroidView を利用することで TextView や EditView などの View 要素を Jetpack Compose の UI 階層に埋め込むことができる。この AndroidView コンポーザブルを使うと Jetpack Compose でも WebView を利用できるようになる。

<T : View> AndroidView(
    factory: (Context) -> T,
    modifier: Modifier,
    update: (T) -> Unit
)

AndroidView コンポーザブルで WebView を生成する

AndroidView コンポーザブルで WebView を生成するのは簡単です。以下のように AndroidView を呼び出して factory と update メソッドを定義してやるだけで WebView を生成して制御することができます。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent { MyWebClient(url = "https://kaleidot.net") }
    }
}

// MEMO
// factory は View を生成するときに一度だけ呼ばれるメソッド
//  今回は WebView を生成したいので factory には WebView のコンストラクターを参照して渡す
// 
// update は UI 階層の再構成時に複数回呼ばれるメソッド
//  factory で生成した View に対して update で表示更新するような仕組みになっている
//  今回は生成された WebView に対して特定の URL の Web ページを表示するようにしてみる
@Composable
fun MyWebClient(url: String) {
    AndroidView(
        factory = ::WebView,
        update = { webView ->
            webView.webViewClient = WebViewClient()
            webView.loadUrl(url)
        }
    )
}

Image.png

おわりに

というように Jetpack Compose では AndroidView を利用すれば WebView や MapView や AdView など既存 SDK で実装された View が利用できます。Jetpack Compose の UI 要素で未対応のものがあれば AndroidView で切り抜けられるようになっていて大変便利ですね。

Discussion