安卓 webView使用介绍:补充篇

之前写过一篇关于webview的文档,不怎么全面所以补充了一下。对于不足之处希望大家给点意见,共同讨论,如果那里写的不明白可以提出,我会在查询之后为大家更新心得文档,多谢。

下面是我在API文档中翻译过来的一段话,总的来说就是sdk中为我们提供的一个用来显示网页的控件。WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用。

一个显示网页的视图。这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础。它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等。

这是官方API里面给出的包结构:


使用前记得在配置文件中加入网络请求权限:

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

在XML布局中添加控件:

<WebView
        android:id="@+id/web_1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

在Java代码中实例化控件:

WebView webView = (WebView)findViewById(R.id.webView);

这里建议把控件设置成全局,这样方便下面对控件进行操作,如:

Private  WebView  webView;
webView = (WebView)findViewById(R.id.webView);

当然,这里可以根据自己的需要进行设计。

有一点需要注意,如果访问的页面中有Javascript,则webview必须设置支持Javascript,因为Android中的WebView默认是不响应JavaScript控件的,网上很多人在问为什么加载的网页链接可以点击并跳转,但是按钮点了却没反应。因为很多网页的控件是通过JS编写的,所以要获取设置WebView的WebSettings对象。代码如下:

//启用支持javascript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);

也可以直接获取,如:

webView.getSettings().setJavaScriptEnabled(true);

两种方式喜欢用那种根据自己的编码习惯来决定。

WebSettings常用的方法如下:
setJavaScriptEnabled(true);	//支持js脚本
setPluginsEnabled(true);						//支持插件
setUseWideViewPort(false);					//将图片调整到适合webview的大小
setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);		//支持内容从新布局
supportMultipleWindows();					//多窗口
setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);		//关闭webview中缓存
setNeedInitialFocus(true);			//当webview调用requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true);				//设置支持缩放
setJavaScriptCanOpenWindowsAutomatically(true);			//支持通过JS打开新窗口
setLoadsImagesAutomatically(true);					//支持自动加载图片

接下来便是加载一个网页,WebView加载界面主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL,

1、LoadUrl   直接加载网页、图片并显示(本地或是网络上的网页、图片、gif)

2、LoadData      显示文字与图片内容(模拟器1.5、1.6)

3、LoadDataWithBaseURL     显示文字与图片内容(支持多个模拟器版本)

这里先用loadUrl()方法进行加载,借用这个方法,有两种加载数据的方式,第一种是本地资源,example.html 存放在assets文件夹内,这里要注意一下加载本地资源时的参数结构(红色部分),如:

webView.loadUrl("file:///android_asset/example.html");

另一种是加载web资源,如:

webView.loadUrl("http://baidu.com");

WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用。
webview有两个方法:setWebChromeClient 和 setWebClient
setWebClient:主要处理解析,渲染网页等浏览器做的事情
setWebChromeClient:辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 
WebViewClient就是帮助WebView处理各种通知、请求事件的。

打开网页时不调用系统浏览器, 而是在本WebView中显示,解决这个问题需要为webview设置 WebViewClient,并重写方法,创建一个自己的WebViewClient,通过setWebViewClient关联,示例代码如下:

private void init(){
        webView = (WebView) findViewById(R.id.webView);
        //WebView加载web资源
       webView.loadUrl("http://baidu.com");
        //覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开
       webView.setWebViewClient(new WebViewClient(){
           @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
               //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
             view.loadUrl(url);
            return true;
        }
       });
    }

若自己定义了一个页面加载进度的progressbar,需要展示给用户的时候,可以通过如下方式获取webview内页面的加载进度,判断页面加载过程:

webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                // TODO Auto-generated method stub
                if (newProgress == 100) {
                    // 网页加载完成
                } else {
                    // 加载中
                }
            }
        });

如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。

webview.requestFocusFromTouch();

这是我写的另一篇关于webview的,下的简单了些不全面,

http://blog.csdn.net/yzf11/article/details/51283683

有关通过webview控件下载文件

通常webview渲染的界面中含有可以下载文件的链接,点击该链接后,应该开始执行下载的操作并保存文件到本地中。webview来下载页面中的文件通常有两种方式,大家可以点开下面的链接进行查看,这里面还包含了一些常见错误的处理,这篇文档是我在网上搜到的不代表我给人观点,希望能帮助大家。

http://www.open-open.com/lib/view/open1431569835951.html

如果希望浏览的网页后退而不是退出浏览器,需要WebView覆盖URL加载,让它自动生成历史访问记录,那样就可以通过前进或后退访问已访问过的站点。


//改写物理按键——返回的逻辑
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode==KeyEvent.KEYCODE_BACK)
        {
            if(webView.canGoBack())
            {
                webView.goBack();//返回上一页面
                return true;
            }
            else
            {
                System.exit(0);//退出程序
            }
        }
        return super.onKeyDown(keyCode, event);
    }

下面是一些WebViewClient 的方法,方便大家使用这里就简单的写了一下,

doUpdateVisitedHistory(WebView view, String url, boolean isReload)  //(更新历史记录) 
onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据) 
onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 
onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。 
onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。 
onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息)
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求) 
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。
onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用) 
onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用) 
shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。 
shouldOverrideUrlLoading(WebView view, String url) 
//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。


相关加血视频:

http://www.imooc.com/video/2269






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值