公式の情報 Load in-app content に沿って、 assets
フォルダを作成し html を配置、AssetLoader を WebView に設定します。
(他にビルド環境に androidx.webkit
の利用の追加が必要ですが、通常は自動で追加されます。)

(Android Studio Ladybug Feature Drop | 2024.2.2)
assets/test1.html
html
1<p>html view test</p>
2<iframe src="/assets/test2.html" id="HTMLViewer" width="auto" height="auto"></iframe>
assets/test2.html
html
1<p>this is test2.html</p>
MainActivity.kt
kotlin
1import android.net.Uri
2import android.os.Bundle
3import android.webkit.WebResourceRequest
4import android.webkit.WebResourceResponse
5import android.webkit.WebView
6import androidx.annotation.RequiresApi
7import androidx.appcompat.app.AppCompatActivity
8import androidx.webkit.WebViewAssetLoader
9import androidx.webkit.WebViewClientCompat
10
11class MainActivity : AppCompatActivity() {
12 override fun onCreate(savedInstanceState: Bundle?) {
13 super.onCreate(savedInstanceState)
14 setContentView(R.layout.activity_main)
15
16 val webView: WebView = findViewById(R.id.webView)
17
18 val assetLoader = WebViewAssetLoader.Builder()
19 .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this))
20 //.addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(this))
21 .build()
22 webView.webViewClient = LocalContentWebViewClient(assetLoader)
23
24 webView.loadUrl("https://appassets.androidplatform.net/assets/test1.html")
25 }
26
27 private class LocalContentWebViewClient(private val assetLoader: WebViewAssetLoader) : WebViewClientCompat() {
28 @RequiresApi(21)
29 override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest) : WebResourceResponse? {
30 return assetLoader.shouldInterceptRequest(request.url)
31 }
32
33 // To support API < 21.
34 override fun shouldInterceptRequest(view: WebView, url: String) : WebResourceResponse? {
35 return assetLoader.shouldInterceptRequest(Uri.parse(url))
36 }
37 }
38}
実行
