Android中的WebView控件用法(二)

本文详细介绍了在Android应用中使用WebView控件访问网页的高级技巧,包括设置控制点、处理物理返回键、链接跳转、加载进度显示、HTTPS请求处理、JS交互方法等。特别强调了如何正确配置权限、自定义事件处理和优化用户体验。

            本文继第一篇文章介绍webView基本使用之后,作进步android中WebView控件研究使用。WebView有四个控制点、物理返回键的处理、控制网页链接在WebView中跳转、显示加载页面的进度条、处理https请求、利用addJavascriptInterface实现android程序和javascript交互等等。
    

     使用WebView控件访问网页,得先在AndroManifest.xml加网络权限,如果不加权限,则会不能访问网页,往往初学者容易犯这样的错误。

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

 

           首先,介绍WebView的四个控制点。

    1)WebView设置WebChromeClient对象。通过该对象设置可以进行窗口关闭和隐藏、消息控制、js对话框和警告框、进度条显示、显示WebView的焦点、js操作前和操作超时等,具体看官网WebChromeClient详细Api。

    2)WebView设置WebViewClient对象。WebView设置改对象,可以实现根据给定的URL下载资源、下载资源开始和结束通知、接受错误信息、控制WebView页面链接等。具体官网WebViewClient详细。

    3)WebSettings设置。管理设置WebView的状态,第一次创建WebView的时候,WebView是默认的状态是默认的设置,所以,要改WebView设置的状态,必须通过getSets方法来获取WebSettins对象,就可以进行是否显示有javascript的网页、是否显示网页大小控制、设置字体大小和颜色、设置缓存、设置是否保存密码等等

    4)设置addJavascriptInterface方法,将java对象绑定到webView中,以方便从页面js中控制java对象,实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webView的代码都是自己完成,详细使用addJavascriptInterface进行自动化见本文5使用addJavascriptInterface完成和js交互

 

1、back键控制网页后退

 

Activity默认的back键处理为结束当前Activity,webView查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onKeyDown函数,告诉他如何处理,如下:

 

Java代码 

public boolean onKeyDown(int keyCode, KeyEvent event) {  

    if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {  

        webView.goBack();  

        return true;  

    }  

    return super.onKeyDown(keyCode, event);  

} 其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true

webView.goBack();表示返回webView的上次访问页面

 

2、在webView网页点击链接的跳转。

webView.setWebViewClient(new WebViewClient() {

                    @Override

                    public boolean shouldOverrideUrlLoading(WebView view, String url) {

                        view.loadUrl(url);

                        return true;

                    }

                }); shouldOverrideUrlLoading表示当前webView中的一个新url需要加载时,给当前应用程序一个处理机会,如果没有重写此函数,webView请求ActivityManage选择合适的方式处理请求,就像弹出uc和互联网让用户选择浏览器一样。重写后return true表示让当前程序处理,return false表示让当前webView处理

 

3、页面加载进度

 

代码如下

 

Java代码 

webView.setWebChromeClient(new WebChromeClient() {  

 

    public void onProgressChanged(WebView view, int progress) {  

        setTitle("页面加载中,请稍候..." + progress + "%");  

        setProgress(progress * 100);  

 

        if (progress == 100) {  

            setTitle(R.string.app_name);  

        }  

    }  

}); 

onProgressChanged通知应用程序当前页面加载的进度

 

progress  表示当前页面加载的进度,为1至100的整数

4、处理https请求

 

webView默认是不处理https请求的,页面显示空白,需要进行如下设置:

 

Java代码 

    webView.setWebViewClient(new WebViewClient() {  

 

        @Override 

        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {  

            handler.proceed();  

//            handler.cancel();  

//            handler.handleMessage(null);  

        }  

    }); 

onReceivedSslError为webView处理ssl证书设置

 

其中handler.proceed();表示等待证书响应

 

handler.cancel();表示挂起连接,为默认方式

 

handler.handleMessage(null);可做其他处理

 

5、使用addJavascriptInterface完成和js交互

 

5.1 javascript中调用java对象及方法

 

设置webView的addJavascriptInterface方法,该方法有两个参数,第一个参数为被绑定到js中的类实例,第二个参数为在js中暴露的类别名,在js中引用java对象就是用这个名字

 

Java代码 

ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();  

webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");  

 

ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();

webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs"); 

 

实现绑定到js的类,其中的javaMethod方法我们将在页面前端js中调用,用于返回一段内容。showHtml用来使用AlertDialog显示一段html代码,稍后将使用到

5.2 java中调用js方法

 

用webView的loadUrl实现,比如现在我们想在页面加载完成后调用js中的hello函数,实现如下:

 

Java代码 

webView.setWebViewClient(new WebViewClient() {    

    @Override 

    public void onPageFinished(WebView webView, String url){  

        webView.loadUrl("javascript:hello()");  

    }  

}); 

 

webView.setWebViewClient(new WebViewClient() { 

    @Override

    public void onPageFinished(WebView webView, String url){

        webView.loadUrl("javascript:hello()");

    }

});怎么样,很简单吧^_^,直接loadUrl("javascript:hello()")就可以了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值