Android网络功能开发(1)——WebView控件使用

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,具体原因还不清楚。如果哪位大佬知道原因,还请不吝赐教。

猜你喜欢

转载自blog.csdn.net/nanoage/article/details/127725331