WebView使用(一)

本篇文章作为我对WebView使用过程中的一个总结。

1.WebView基本使用。在app中显示在线网址。

设置权限

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

写布局文件

<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>```

在Acitvity中mWebView.loadUrl(url);//这种写法应用启动后会开启手机内置浏览器

要想在应用中打开网页,需要我们在调用loadUrl前加上如下这句。
mWebView.setWebViewClient(new WebViewClient());

访问www.baidu.com。干净简洁没新闻,没广告。但是记得我们的url需要写成http://www.baidu.com。 WebView是不会添加头的。
上面我们使用WebViewClient这个类,之后根据问题再介绍。

2.在网页没出来之前显示一片空白,怎样知道网页加载的速度。

更改布局,在LinearLayout布局中增加一个button和一个progress

    <Button  android:id="@+id/webview_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击加载"/>
    <ProgressBar
        android:id="@+id/webview_progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:max="100"
        android:progress="0" />```

我们在代码中自定义类

private class CustomChromeClient extends WebChromeClient{
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
mProgressBar.setProgress(newProgress);
if (newProgress == mProgressBar.getMax()) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
}
}
}同时mWebView.setWebChromeClient(new CustomChromeClient());```
点击界面的按钮,我们可以看到在按钮下方的进度条,会有一个进度。这个进度条的样式是系统默认的样式。但是我们发现,我们的进度条在加载到100的时候,又重头加载了一次。我们可以通过在onProgressChanged打log来跟踪,进度的变化情况。因为我们访问的是http://www.baidu.com. 这个会自动重定向到一个新的url。
我们是怎么发现它定向到一个新的地址的呢?我们定义了一个类

    private class CustomWebViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
           return super.shouldOverrideUrlLoading(view,url);
        }
    }```
并且添加
```mWebView.setWebChromeClient(new CustomChromeClient());```
运行后,在类里面打日志,会发现我们的百度的地址做了重定向。我再次用chrome浏览器访问百度的地址,没有发现进度条出现的状况。在chrome里显示新闻以及广告,在我们的app了没有。我怀疑是网页内js和css的问题。所以设置了

mWebView.getSettings().setJavaScriptEnabled(true);//支持js```
这样再次运行的时候就不会出现进度条结束后又重新走的情况,我们观察下shouldOverrideUrlLoading里方法的日志。没有重定向。而且显示新闻和广告跟chrome浏览器里显示的一样了。

3.了解一下WebViewClient

点到这个类里可以看到有好多方法。

1.onPageStarted和onPageFinished

根据字面意思就是在加载页面的开始和结束的时候调用的方法。
如果我们要显示一个不用时时更新进度的进度条,就可以放在这两个位置完成进度条的隐藏和现实。

2.public boolean shouldOverrideUrlLoading(WebView view, String url) 在onpagestarted方法后 会回调这个这个方法

在加载url时我们会首先调用这个方法,拦截要访问的url。这个方法的默认返回值是false,就是默认加载url。如果返回true为不加载。
如下
mWebView.setWebViewClient(new WebViewClient());
如果我们不setWebViewClient 那么网页就会在系统浏览器中打开。
这个方法能做什么呢?

  • 在webview中打开应用

             //在方法中添加,跳转到应用市场。 
             url="market://details?id=com.instagram.android";
             //打开应用市场
             if(url.startsWith("market:")){
                 Intent intent = new Intent(Intent.ACTION_VIEW);
                 intent.setData(Uri.parse(url));
                 if (intent.resolveActivity(getPackageManager()) != null) { //可以接收
                     startActivity(intent);
                 }
                 return true;
             } ```
    
  • 地址替换
    在方法里判断 如果为某一网址,则替换为其他网址。
    如果想在webview中打开,不跳转。

           if(url.startsWith("market://")){
                String tmpUrl=url.substring(9);
                url="https://play.google.com/store/apps/"+tmpUrl;
            }```
当然我们还可以打开其他应用。应用的地址通常可能是。pinterest://feed/home?link_click_id=292551922683456291
跟处理market的方法一致。
pinterest://feed/home?类似这样的url是可以自定义的(设置启动activity的data方法里的schema port等参数)。相关帮助可以搜索“在浏览器中打开应用”。

#####3.public void onLoadResource(WebView view, String url) 在每次在加载资源前会调用该方法.
资源有.js .css 图片类型 链接等

private final Pattern imageUrlPattern = Pattern.compile("(.)+\(jpg|gif|png|bmp|jpeg){1}", Pattern.CASE_INSENSITIVE);```

         Matcher m = imageUrlPattern.matcher(url);
           if (m.find()) {
               Log.i(WEBVIEWLOG,"保存这张图片");
           }```
上面的代码用来获取后缀符合要求的图片资源。有些图片资源的url并没有.jpg这样的后缀,那我们需要URLConnect重新去访问这个资源url,并获取contentType 根据这个值来确定是否为图片。
#####4 public WebResourceResponse shouldInterceptRequest(WebView view,String url)  
跟上面介绍的类似,也是在加载资源的时候会调用此方法,这个的调用在onLoadResource方法之前。
此方法默认是返回null,会加载当前页面的资源。这个方法是在非UI线程里执行的,所以如果要更新UI需要使用handler。
我们可以用这个方法来做什么?
可以在返回WebResourceResponse结果的时候替换为我们期待的结果,例如,我们替换网页中的图片。或者插入我们本地网页。
   //将网页替换为本地图片
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
        WebResourceResponse response = null;
        try {
            InputStream input = getAssets().open("Jellyfish.jpg");
            response = new WebResourceResponse("image/png", "UTF-8", input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }``` 
5.WebViewClient的其他方法
  • onFormResubmission 是否重发post请求,默认为不重发
  • doUpdateVisitedHistory 更新访问历史
  • onReceivedLoginRequest 通知主程序执行了自动登录请求
  • onReceivedSslError 接收HTTPS页面的错误
  • onReceivedError 接收HTTP页面的错误

参考文章http://blog.csdn.net/harvic880925/article/details/51523983

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容