(Android/안드로이드) WebView에 HTML 템플릿 적용하기 (assets + loadDataWithBaseURL)

개요


1. assets/test.html 템플릿 (토큰 방식 권장)

<!doctype html>
<html lang="ko">
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <!--  -->
</head>
<body>
<!--  -->
</body>
</html>

2. 코틀린 템플릿 치환 + webView 로드

2.1 템플릿 렌더러

object HtmlTemplateRenderer {

    fun render(
        templateHtml: String,
        styleTagFromWeb: String?,   // "<style>...</style>" 통째로 온다고 가정
        bodyInnerFromWeb: String?   // "<div>...</div>" 만 온다고 가정
    ): String {
        val styleTag = styleTagFromWeb.orEmpty()
        val bodyInner = bodyInnerFromWeb.orEmpty()

        // (선택) 아주 최소한의 방어: styleTag에 <style>가 없으면 삽입 안 함
        val safeStyleTag = if (styleTag.trim().startsWith("<style", ignoreCase = true)) {
            styleTag
        } else {
            "" // 전제와 다르면 무시(또는 에러 처리)
        }

        return templateHtml
            .replace("", safeStyleTag)
            .replace("", bodyInner)
    }
}

2.2 assets 읽기 & webView 표

fun loadWebHtmlIntoWebView(
    context: Context,
    webView: WebView,
    styleTagFromWeb: String,     // "<style>...</style>"
    bodyInnerFromWeb: String     // "<div>...</div>"
) {
    val template = AndroidUtils.readFromAssets(context, "test.html")

    val finalHtml = HtmlTemplateRenderer.render(
        templateHtml = template,
        styleTagFromWeb = styleTagFromWeb,
        bodyInnerFromWeb = bodyInnerFromWeb
    )
    webView.settings.javaScriptEnabled = true // 필요 시만
    webView.settings.domStorageEnabled = true // 필요 시만

    // assets 내 리소스/상대경로가 있으면 이 baseUrl이 안정적
    val baseUrl = "file:///android_asset/"

    webView.loadDataWithBaseURL(
        baseUrl,
        finalHtml,
        "text/html",
        "utf-8",
        null
    )
}

3. 왜 loadDataWithBaseURL()을 쓰는가? (포스팅에 넣기 좋은 설명)


4. 주의사항 (전제가 맞아도 실무에서 중요한 포인트)



Related Posts