Android WebView使用

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

你可能感兴趣的:(WebView,android,kotlin,webview)