Webviewの実装

    Webviewの実装


    記事の要約

    Android アプリで Webview を使用している場合は、次の点に注意してください。

    WebViewクライアント

    shouldOverrideUrlLoading

    webView.loadUrl(url) shouldOverrideUrlLoading 関数に含めないでください。別途スキームがある場合は、以下のコードを参考にして、対応する関数で定義してください。

    webView.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(
            view: WebView?,
            request: WebResourceRequest?
        ): Boolean {
            // if you have custom scheme
            val url = request?.url ?: return super.shouldOverrideUrlLoading(view, request)
            if (url.toString().startsWith("market")) {
                val intent = Intent(Intent.ACTION_VIEW).apply {
                    data = url
                }
                startActivity(intent)
                return true
            }
            return super.shouldOverrideUrlLoading(view, request)
        }
    }


    WebChromeクライアント

    onCreateWindow

    1. 項目をクリックしたときにウィンドウを切り替えたい場合は、次のコードを参考にしてください。

    webView.webChromeClient = object : WebChromeClient() {
        override fun onCreateWindow(
            view: WebView?,
            isDialog: Boolean,
            isUserGesture: Boolean,
            resultMsg: Message?
        ): Boolean {
            view ?: return true
            resultMsg ?: return true
            val subWebView = WebView(view.context)
            subWebView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    url ?: return false
                    if (url.startsWith("http")) {
                        // if you want to open current webView
                        webView.loadUrl(url)
                    }
                    return true
                }
                override fun shouldOverrideUrlLoading(
                    view: WebView?,
                    request: WebResourceRequest?
                ): Boolean {
                    val url = request?.url?.toString() ?: return false
                    if (url.startsWith("http")) {
                        // if you want to open current webView
                        webView.loadUrl(url)
                    }
                    return true
                }
            }
            val viewTransport = (resultMsg.obj as? WebView.WebViewTransport) ?: return true
            viewTransport.webView = subWebView
            resultMsg.sendToTarget()
            return true
        }
    }

    2. クリックしたときに新しいウィンドウで開くようにしたい場合は、以下のコードを参考にしてください。

    webView.webChromeClient = object : WebChromeClient() {
        override fun onCreateWindow(
            view: WebView?,
            isDialog: Boolean,
            isUserGesture: Boolean,
            resultMsg: Message?
        ): Boolean {
            view ?: return true
            resultMsg ?: return true
            val subWebView = WebView(view.context)
            subWebView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    url ?: return false
                    if (url.startsWith("http")) {
                        // if you want to open new page
                        val intent = Intent(Intent.ACTION_VIEW).apply {
                            data = Uri.parse(url)
                        }
                        startActivity(intent)
                    }
                    return true
                }
                override fun shouldOverrideUrlLoading(
                    view: WebView?,
                    request: WebResourceRequest?
                ): Boolean {
                    val url = request?.url?.toString() ?: return false
                    if (url.startsWith("http")) {
                        // if you want to open new page
                        val intent = Intent(Intent.ACTION_VIEW).apply {
                            data = Uri.parse(url)
                        }
                        startActivity(intent)
                    }
                    return true
                }
            }
            val viewTransport = (resultMsg.obj as? WebView.WebViewTransport) ?: return true
            viewTransport.webView = subWebView
            resultMsg.sendToTarget()
            return true
        }
    }


    What's Next