当前位置:操作系统 > 安卓/Android >>

Android WebView使用

 

本文主要对WebView进行介绍,包括webView 4个可以定制的点、设置WebView back键响应、控制网页的链接仍在webView中跳转、显示页面加载进度、处理https请求、利用addJavascriptInterface实现android程序和javascript交互等等

 

 

 

WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问

 

Xml代码 

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

 

<uses-permission android:name="android.permission.INTERNET" />WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

 

WebView有几个可以定制的点:

 

(1)设置WebChromeClient子类,WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等,详见WebChromeClient

 

 

 

(2)设置WebViewClient子类,WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见WebViewClient

 

 

 

(3)设置WebSettings类,其中包含多项配置。WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见WebSettings

 

 

 

(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);  

 

    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中跳转

 

Java代码 

webView.setWebViewClient(new WebViewClient() {  

 

    @Override 

    public boolean shouldOverrideUrlLoading(WebView view, String url) {  

        view.loadUrl(url);  

        return true;  

    }  

}); 

 

                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处理

 

Xml代码 

Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. 

 

Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url.参考:

 

http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)

 

 

 

问题分析:

 

今天在用webView load腾讯的OAuth页面http://open.t.qq.com/cgi-bin/authorize

 

时,突然弹出选择uc还是互联网浏览器的确认框,很奇怪,其他页面都能正常load,而这个却无法在webView中load,后来用火狐看了下是因为load这个页面的时候会重定向到另外一个页面http://open.t.qq.com/oauth_html/login.php?oauth_token=xxx&type=0,而webView没有设置shouldOverrideUrlLoading,导致url交给了ActivityManage去处理,解释如上,后添加后可正常load页面

 

 

 

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

      

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,