持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
上一篇文章我们介绍了webview的三个内置方法的第一个setWebViewClient,很多web页面加载过程中的特殊业务处理都是在这个方法的回调里处理的,下面我们介绍第二个方法:setWebChromeClient
setWebChromeClient 的定义及使用
定义:setWebChromeClient相对于setWebViewClient,它的作用主要是处理web页面的加载,渲染等浏览器所需要处理的事,以及javaScript的一些UI相应事件处理,以及web页面加载进度的回调处理。
setWebChromeClient的一个内置方法
和setWebViewClient一样,setWebChromeClient也有它自己的内置方法回调。
我们简单介绍几个常用的:
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加载页面的信息来的。