简介 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) } }