WebView控件用来在应用中显示网页,就好比是在应用中嵌入了一个浏览器窗口。有了这个浏览器窗口,还可以实现与HTML5混合式开发,从而使应用具有跨平台、便于更新等优点。
WebView的用法和ImageView等控件的用法基本一样,使用时可以分两个步骤。第一步先把WebView添加到界面中,然后第二步再通过调用某个方法载入网页。下面是一个简单的例子。
这个界面就像一个迷你浏览器,中间显示网页的部分就是一个WebView控件。为了输入网址,在上部又加了一个文本框和按钮。这三个控件通过布局管理器组织起来,这样就把WebView加到了界面中。在文本框中输入一个URL网址,然后点击GO按钮,就会执行载入网页的代码:
String url = etUrl.getText().toString();
view.loadUrl(url);
载入网页用的是WebView的loadURL方法,参数就是文本框中输入的字符串。代码中用到了两个对象,etUrl就是文本框对象,view就是WebView对象。
这里需要注意从Android9.0(API28)开始,默认情况下禁用http明文通信,也就是说以“http:”开头的url是无法打开的,会报错:net::ERR_CLEARTEXT_NOT_PERMITTED。
使用WebView控件时还有两点需要注意:
- 一是要设置允许JavaScript,因为现在大部分网页都使用了JavaScript,不允许JavaScript的话显示不完全。
- 二是要设置WebView控件的WebViewClient属性,才能将网页载入锁定在此控件中。不设置的话载入网页时会另外打开浏览器应用,而不会将网页载入到WebView中。同时,要覆盖WebViewClient的shouldOverrideUrlLoading()方法对WebView不支持的协议进行拦截,否则会报错:net::ERR_UNKNOWN_URL_SCHEME。WebView只支持http和https协议,所以只能加载http和https开头的url,对于一些网站的重定向到自定义协议的链接,是识别不了的。
这两个设置一般在Activity的onCreate方法中,当创建完WebView对象后进行,具体的代码如下:
view.getSettings().setJavaScriptEnabled(true);
view.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView v, WebResourceRequest request) {
// 在此方法中可以选择是否对url进行拦截,返回true表示拦截,返回false表示不拦截
// WebView只能加载http和https开头的url
// 加载其他自定义协议开头的url会报错:net::ERR_UNKNOWN_URL_SCHEME
String url = request.getUrl().toString();
if(url.startsWith("https:")) {
v.loadUrl(url); // 在WebView控件中加载url
return true; // 在本方法中已经对url进行了处理,后续webview不需要再处理
} else {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent); // 启动能处理的应用去加载url
return true; // 无法识别的协议后续不处理
}
}
});
因为需要访问互联网,所以还要添加权限:
<uses-permission android:name="android.permission.INTERNET" />
经测试,这个例子在API31(Android12.0)上能够正确运行。但在API26(Android8.0)上加载页面时报错:java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/TracingController,具体原因还不清楚。如果哪位大佬知道原因,还请不吝赐教。