안드로이드

[안드로이드] 2-1. WebView 웹뷰 - 로컬 HTML불러오기 (Kotlin)

디벨로펄 2023. 3. 11.
반응형

참고자료 : https://developer.android.com/guide/webapps/webview?hl=ko 

 

WebView에서 웹 앱 빌드  |  Android 개발자  |  Android Developers

WebView에서 웹 앱 빌드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 웹 애플리케이션 또는 웹페이지만 클라이언트 애플리케이션의 일부로 제공하려는 경

developer.android.com

1. Local HTML파일 불러오기

2. Javascript 인터페이스 테스트

 

 

먼저, Test를 위해서 로컬 html을 불러와보자.

 

◆ 인앱 콘텐츠 로드(WebViewAssetLoader)

인터넷 대신 애플리케이션에 삽입되어 있는 웹기반 컨텐츠를 정적으로 컴파일할 수도 있다.

장점 : 인터넷 액세스 필요가 없으며, 사용자 대역폭을 소비하지 않는다. 

단점 : 웹 기반 컨텐츠 업데이트 하려면, 앱을 업데이트 해야함.(웹의 장점없어짐)

 

0. build.gradle 추가

implementation 'androidx.webkit:webkit:1.4.0'

1. WebVeiw  자산 로더 생성

class LocalContentWebViewClient (private val assetLoader: WebViewAssetLoader) : WebViewClientCompat() {
    override fun shouldInterceptRequest(
        view: WebView,
        request: WebResourceRequest
    ): WebResourceResponse? {
        return assetLoader.shouldInterceptRequest(request.url)
    }

    // to support API < 21
    @Deprecated("Deprecated in Java")
    override fun shouldInterceptRequest(
        view: WebView,
        url: String
    ): WebResourceResponse? {
        return assetLoader.shouldInterceptRequest(Uri.parse(url))
    }
}

2. 웹뷰에 webViewClient 설정 및 LoadUrl

class JavascriptInterfaceActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // inflate : xml의 뷰를 객체화 해준다.
        val binding = ActivityJavascriptBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val myWebView = binding.webview
        val assetLoader = WebViewAssetLoader.Builder()
            .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this))
            .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(this))
            .build()
        myWebView.webViewClient =LocalContentWebViewClient(assetLoader)
        myWebView.loadUrl("https://appassets.androidplatform.net/assets/javascriptInterfaceTest.html")
    }
}

*javascriptInterfaceTest.html

더보기

 

<html>
    <head>

    </head>
    <script type="text/javascript">
        function showAndroidToast(toast) {
            Android.showToast(toast);
        }

    </script>
    <body>
        <input
                type="button"
                value="Say hello"
                onClick="showAndroidToast('Hello Android!')" />
        <p>This file was loaded from in-app content</p>
    </body>
</html>

결과 화면!!

결과적으로 보이는 화면!

* assets 폴더 생성(아마 res아래 하려하면 안보일것이다.)

app 우클릭>new>Folder>Assets Folder

 

반응형

댓글