本文正在参与「金石计划 . 分割6万现金大奖」

前语

最近工作上需求变得简单,因为是接H5网页到APP展示,所以,内容不需求咱们客户端去编写了,只需求将网页在APP内展示出来即可,所以用到了WebView(网页视图),正好聊聊工作上遇到的问题与解决办法,也正好更新一下本根底必备系列。

本篇便是阐明如何用WebView去加载网页的,是根底但也是有必要把握的常识内容,下面就让咱们看看WebView的用法。

正篇

根底用法

其实WebView的运用是非常简单的,和修改视图(EditView)和文本视图(TextView)等大多数视图相同,首要咱们需求将视图添加在Activity或Fragment的布局中,下面便是在XML布局中添加的Demo代码:

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

XML添加好后,咱们还需求在Activity中去调用它的办法,代码如下:

class MainActivity : AppCompatActivity() {
    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.webView.settings.javaScriptEnabled = true
        binding.webView.loadUrl("https:///")
    }
}

运用webView.settings.javaScriptEnabled能够承认是否运用Js交互,一般用到Js都给翻开了,即置为true

咱们拜访的是网络资源,所以需求运用网络权限,在AndroidManifest.xml清单文件中添加上网络权限:

安卓开发基础技术——WebView加载网页

<uses-permission android:name="android.permission.INTERNET"/>

写好以上过程的代码后运行就能够看到如下作用:

安卓开发基础技术——WebView加载网页

咱们成功在App内拜访了网站,根底用法就完毕了。

WebView的其他常用办法

说完WebView的一般运用办法,那咱们也要看看其他在开发中常用的办法,开发中咱们一般需求配合需求与服务端对网页的一些行为进行操控,比方H5网页加载的一些交互,所以下面咱们就着重讲述这方面的办法。 本例子项目工程文件现已放在GitHub上,地址为:github.com/AndroidStud… ,下面是基于之前的Demo工程(详见 安卓UI设计开发——Material Design(BottomSheetDialogFragment篇) – ())在ImageView上添加点击跳转事件到该WebView页面:

安卓开发基础技术——WebView加载网页
安卓开发基础技术——WebView加载网页

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".WebViewTest">
    <WebView
        android:id="@+id/vWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

持续运用上面根底用法的XML用法,但在Activity中调用办法,代码如下:

class WebViewTest : AppCompatActivity() {
    private lateinit var binding: ActivityWebViewTestBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityWebViewTestBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initWeb()
    }
    private fun initWeb() {
        val setting = binding.vWebView.settings
        setting.javaScriptEnabled = true
        setting.javaScriptCanOpenWindowsAutomatically = true
        binding.vWebView.webChromeClient = object : WebChromeClient() {
            override fun onProgressChanged(view: WebView?, newProgress: Int) {
                Log.i("onPageStarted", "页面加载")
                super.onProgressChanged(view, newProgress)
            }
            override fun onShowFileChooser(
                webView: WebView?,
                filePathCallback: ValueCallback<Array<Uri>>?,
                fileChooserParams: FileChooserParams?
            ): Boolean {
                Log.i("onShowFileChooser", "文件处理")
                return true
            }
        }
        binding.vWebView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                Log.i("shouldOverrideUrl", "页面处理:" + view!!.url)
                return super.shouldOverrideUrlLoading(view, request)
            }
            override fun shouldInterceptRequest(
                view: WebView?,
                request: WebResourceRequest?
            ): WebResourceResponse? {
                return super.shouldInterceptRequest(view, request)
            }
        }
        loadWeb()
    }
    private fun loadWeb(){
        binding.vWebView.loadUrl("https:///")
    }
}

咱们首要将之前写在Activity的WebView调用办法包装到initWeb()办法与loadWeb()办法里,然后在onCreate办法里调用initWeb()办法即可。

webChromeClient与webViewClient

在initWeb()办法中咱们能够看到新增了webChromeClient与webViewClient办法,其间webChromeClient是用来帮助WebView处理各种Js的交互事件,比方上面代码中的:
onProgressChanged是用来获取网页的加载进展,能够操控进展的显现作用(比方能够在Webwiew布局下加一个ProgressBar,用来操控进展显现和进展动画样式等)
onShowFileChooser能够调用它来处理具有“file”输入类型的 HTML 表单,以呼应用户按下“Select File”按钮,因为安卓现在调用相机需求权限所以一般需求在这个办法里添加用户权限的对话以获取权限然后再进行摄影等后续操作。

webViewClient中咱们能够处理一些通知以及呼应事件,在开发中咱们经常会在其间运用*shouldOverrideUrlLoading()*办法用来处理加载网页时分的一些对URL的操作,即当 URL 行将加载到当时 WebView 的时分,让咱们有机会进行操控。
如果未供给 WebViewClient,默认情况下 WebView 将要求 Activity Manager 为 URL 挑选正常加载机制。
如果供给了 WebViewClient,则回来true会导致当时 WebView 中止加载 URL,而回来false会导致 WebView 照旧持续加载 URL,咱们就能够主动主动回来true来挑选对URL操作,比方不必浏览器翻开URL而是在当时WebView加载。

还有一点需求注意,现在shouldOverrideUrlLoading(WebView view, String url)办法现已废弃,需求选用上面的办法,不过在上面的代码中也给出了获取url的办法:

view!!.url

安卓开发基础技术——WebView加载网页

回来网页上一页与退出WebView

咱们在WebView中一般拜访网页会点击进入多页面拜访,这时分咱们回来一般需求的是回来上一页web页面而不是关闭整个网页,所以就有以下处理,调用WebView的goBack()办法:

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    if (keyCode == KeyEvent.KEYCODE_BACK && binding.vWebView.canGoBack()) {
        binding.vWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event)
}

而在退出WebView是一定要记得毁掉它,如下处理:

override fun onDestroy() {
    //加载空的
    binding.vWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
    //清楚历史记录,看情况
    binding.vWebView.clearHistory();
    //毁掉
    binding.vWebView.destroy();
    super.onDestroy()
}

总结

以上便是WebView的根底运用办法和日常用到的办法,此外还有一些如onReceivedError() 办法用于页面加载过错更换提示之类的办法咱们在文章中未提到,后续有关WebView还会渐渐添加到本文中,便利回顾与学习。