Android开发-WebView(三)-setWebChromeClient

1,188 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

上一篇文章我们介绍了webview的三个内置方法的第一个setWebViewClient,很多web页面加载过程中的特殊业务处理都是在这个方法的回调里处理的,下面我们介绍第二个方法:setWebChromeClient

setWebChromeClient 的定义及使用

定义:setWebChromeClient相对于setWebViewClient,它的作用主要是处理web页面的加载,渲染等浏览器所需要处理的事,以及javaScript的一些UI相应事件处理,以及web页面加载进度的回调处理。

setWebChromeClient的一个内置方法

和setWebViewClient一样,setWebChromeClient也有它自己的内置方法回调。

image.png

我们简单介绍几个常用的:

onJsAlert :字面意思就可以理解,它主要是页面的警告弹框,但是对于webview,它是不会展示web页面的Alter弹框的,需要自己去处理,它有几个参数(WebView view, String url, String message, final JsResult result),url是当前页面加载的地址,message是Alter弹出的提示信息,result是处理结果;

onJsPrompt:和onJsAlert一样,它是处理prompt弹框,同样webview都会进行拦截,如果想实现就需要自己去处理显示的逻辑;

onJsConfirm:同上面2个,处理confirm弹框的;

onProgressChanged:用到最多的就是这个方法回调了,它是回调当前web页面的加载进度,可以用来添加进度条,页面加载的样式;

简单贴下onJsAlert的处理代码:

public class MainActivity : Activity() {
    
    private webView:WebView ?= null

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        webView = findViewById<WebView>(R.id.wv_webview)
        webView.webViewClient = object:WebViewClient(){
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                Log.e("onPageStarted", "页面加载前:$url")
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                Log.e("onPageFinished", "页面加载后:$url")
            }

            override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                return super.shouldOverrideUrlLoading(view, request)
                Log.e("shouldOverrideUrl", "页面处理:" + view!!.url)
            }
        }
        webView.setWebChromeClient(object : WebChromeClient() {
            override fun onJsAlert(
                view: WebView?,
                url: String?,
                message: String?,
                result: JsResult?
            ): Boolean {
                val b: AlertDialog.Builder = AlertDialog.Builder(MainActivity.this)
                b.setTitle("这个是处理Alert回调的")
                b.setMessage(message)
                b.setPositiveButton(
                    "确定"
                ) { _, _ -> result!!.confirm() }
                b.setCancelable(false)
                b.create().show()
                return true
            }
        })
        loadWeb()
    }

    private fun loadWeb(){
        webView.loadUrl("http://www.baidu.com")
    }
}

WebViewClient的内部实现就没有贴太多了,简单的实现了下,打印下简单的日志,有需要处理的逻辑这里可以处理,着重把onJsAlert这个方法的处理实现了下,如果想做警告弹框,就可以在这里根据自己的业务来实现不同样式的弹框,内容是根据web加载页面的信息来的。