Android WebView使用
简介
WebView控件的主要作用是显示和渲染Web页面,Android4.4之前使用的webkit内核,4.4之后使用的chrome内核,可以直接加载Html代码也可以加载指定页面,还可以与JS交互。
常用属性和方法
val webSettings = webView.settings
//是否支持内容URL访问
webSettings.allowContentAccess = true
//是否支持文件访问
webSettings.allowFileAccess = true
//是否允许通过 file url 加载的 Js代码读取其他的本地文件
webSettings.allowFileAccessFromFileURLs = true
//是否允许通过 file url 加载的 Js代码读取任何来源资源
webSettings.allowUniversalAccessFromFileURLs = true
//是否不从网络加载任何资源
webSettings.blockNetworkLoads = false
//是否支持数据库存储
webSettings.databaseEnabled = true
//是否显示屏幕缩放控件
webSettings.displayZoomControls = false
//是否支持DOM Storage
webSettings.domStorageEnabled = true
//是否支持JavaScript
webSettings.javaScriptEnabled = true
//是否不自动播放音视频
webSettings.mediaPlaybackRequiresUserGesture = false
//是否支持多个窗口
webSettings.setSupportMultipleWindows(true)
//是否开启全局缓存
webSettings.setAppCacheEnabled(true)
//是否支持通过JS打开新窗口
webSettings.javaScriptCanOpenWindowsAutomatically = true
//开启https和http混用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
//是否将视图调整到合适大小
webSettings.useWideViewPort = true
//是否适配屏幕
webSettings.loadWithOverviewMode = true
//是否使用内置的缩放
webSettings.builtInZoomControls = false
//是否不从网络加载图像资源
webSettings.blockNetworkImage = false
//是否自动加载图片
webSettings.loadsImagesAutomatically = true
//判断网络状态
if (NetWorkUtils.isNetworkConnected) {
//缓存模式如下:
//LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
//LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
} else {
webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
}
//1:加载一个网页
webView.loadUrl("http://www.wanandroid.com");
//2:加载应用资源文件内的网页
webView.loadUrl("file:///android_asset/aaa.html");
//3:加载一段代码
webView.loadData(String data,String mimeType, String encoding);
//4:加载一段代码
//baseUrl:表示基础的网页
//data:表示要加载的内容
//mimeType:表示加载网页的类型
//encoding:表示编码格式
//historyUrl:表示可用历史记录,可以为null值
WebView.loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl))
//返回监听
onBackPressedDispatcher.addCallback(this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (WebView.canGoBack()) {
WebView.goBack()
} else {
finish()
}
}
})
webView.apply {
loadUrl("http://www.wanandroid.com")
webViewClient = object : WebViewClient() {
//设置不调用浏览器,使用当前webView显示
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
view.loadUrl(url)
return true
}
//页面开始加载
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
//todo
}
//页面加载结束
override fun onPageFinished(view: WebView?, url: String?) {
//todo
}
//加载页面资源,如图片、视频等
override fun onLoadResource(view: WebView?, url: String?) {
//todo
}
//加载服务器错误时(如404)
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
//自定义错误页面
}
//加载服务器SSL错误
override fun onReceivedSslError(
view: WebView?,
handler: SslErrorHandler?,
error: SslError?
) {
handler!!.proceed();// 接受所有网站的证书
// handler!!.cancel();// Android默认的处理方式
//进行其他处理
}
}
webChromeClient = object : WebChromeClient() {
//获取页面标题
override fun onReceivedTitle(view: WebView?, title: String?) {
dataBinding.tvDetailTitle.text = title
}
//页面加载进度
override fun onProgressChanged(view: WebView?, newProgress: Int) {
if (newProgress < 100) {
dataBinding.pbDetail.visibility = View.VISIBLE
dataBinding.pbDetail.progress = newProgress
} else {
dataBinding.pbDetail.visibility = View.GONE
}
}
//显示JS警告框
override fun onJsAlert(
view: WebView?,
url: String?,
message: String?,
result: JsResult?
): Boolean {
//自定义警告框
return true
}
//显示JS确认框
override fun onJsConfirm(
view: WebView?,
url: String?,
message: String?,
result: JsResult?
): Boolean {
//自定义确认框
return true
}
//显示JS输入框
override fun onJsPrompt(
view: WebView?,
url: String?,
message: String?,
defaultValue: String?,
result: JsPromptResult?
): Boolean {
//输入框
return true
}
}
//下载文件监听
setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
//跳转到浏览器下载
val intent = Intent(Intent.ACTION_VIEW)
intent.addCategory(Intent.CATEGORY_BROWSABLE)
intent.data = Uri.parse(url)
startActivity(intent)
}
}