首页 > 代码库 > WebView的用法

WebView的用法

基本用法

布局文件配置WebView

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

WebView加载网页
      

     //加载网页链接
        mWebView.loadUrl("http://www.itheima.com");
        //加载本地assets目录下的网页
        mWebView.loadUrl("file:///android_asset/demo.html");

WebView基本设置

        WebSettings settings = mWebView.getSettings();
        settings.setBuiltInZoomControls(true);// 显示缩放按钮(wap网页不支持)
        settings.setUseWideViewPort(true);// 支持双击缩放(wap网页不支持)
        settings.setJavaScriptEnabled(true);// 支持js功能

设置WebViewClient

     

  mWebView.setWebViewClient(new WebViewClient() {
            // 开始加载网页
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                System.out.println("开始加载网页了");
            }

            // 网页加载结束
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                System.out.println("网页加载结束");
            }

            // 所有链接跳转会走此方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                System.out.println("跳转链接:" + url);
                view.loadUrl(url);// 在跳转链接时强制在当前webview中加载

                //此方法还有其他应用场景, 比如写一个超链接<a href="http://www.mamicode.com/tel:110">联系我们</a>, 当点击该超链接时,可以在此方法中获取链接地址tel:110, 
              //解析该地址,获取电话号码, 然后跳转到本地打电话页面, 而不是加载网页, 从而实现了webView和本地代码的交互
                return true;
            }
        });

设置WebChromeClient

 mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                // 进度发生变化
                System.out.println("进度:" + newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                // 网页标题
                System.out.println("网页标题:" + title);
            }
        });

WebView加载上一页和下一页

mWebView.goBack();//跳到上个页面 mWebView.goForward();//跳到下个页面 mWebView.canGoBack();//是否可以跳到上一页(如果返回false,说明已经是第一页) mWebView.canGoForward();//是否可以跳到下一页(如果返回false,说明已经是最后一页)

 

WebView高级用法

缓存设置 

    WebSettings settings = mWebView.getSettings();
        //只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        //只加载缓存
        settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
        //根据cache-control决定是否从网络上取数据
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        //不加载缓存
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);    

什么是cache-control?

        cache-control是在请求网页时服务器的响应头,此响应头用于决定网页的缓存策略.       

   常见的取值有public(所有内容都将被缓存), private(内容只缓存到私有缓存中),no-cache(所有内容都不会被缓存),max-age=xxx(缓存的内容将在 xxx 秒后失效)等等

 如图所示:

技术分享


清理缓存

   最简便的方式:
        mWebView.clearCache(true);

        另外一种方式:
        //删除缓存文件夹
        File file = CacheManager.getCacheFileBaseDir(); 

           if (file != null && file.exists() && file.isDirectory()) { 
            for (File item : file.listFiles()) { 
             item.delete(); 
            } 
            file.delete(); 
           } 
        //删除缓存数据库
        context.deleteDatabase("webview.db"); 
        context.deleteDatabase("webviewCache.db");

Cookie设置

        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        String cookie = "name=xxx;age=18";
        cookieManager.setCookie(URL, cookie);
        CookieSyncManager.getInstance().sync();

获取Cookie

        CookieManager cookieManager = CookieManager.getInstance();
        String cookie = cookieManager.getCookie(URL);

清除Cookie

        CookieSyncManager.createInstance(context);  
        CookieManager cookieManager = CookieManager.getInstance(); 
        cookieManager.removeAllCookie();
        CookieSyncManager.getInstance().sync();

Demo演示:

package com.loaderman.webviewdemo;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView mWebView = (WebView) findViewById(R.id.wv_test);
        //加载网页链接
        mWebView.loadUrl("http://www.baidu.com");
        //加载本地assets目录下的网页
        //mWebView.loadUrl("file:///android_asset/demo.html");
        WebSettings settings = mWebView.getSettings();
        settings.setBuiltInZoomControls(true);// 显示缩放按钮(wap网页不支持)
        settings.setUseWideViewPort(true);// 支持双击缩放(wap网页不支持)
        settings.setJavaScriptEnabled(true);// 支持js功能
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                // 进度发生变化
                System.out.println("进度:" + newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                // 网页标题
                System.out.println("网页标题:" + title);
            }
        });
        mWebView.setWebViewClient(new WebViewClient() {
            // 开始加载网页
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                System.out.println("开始加载网页了");
            }

            // 网页加载结束
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                System.out.println("网页加载结束");
            }
            // 所有链接跳转会走此方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                System.out.println("跳转链接:" + url);
                view.loadUrl(url);// 在跳转链接时强制在当前webview中加载
                //此方法还有其他应用场景, 比如写一个超链接<a href="http://www.mamicode.com/tel:110">联系我们</a>, 当点击该超链接时,可以在此方法中获取链接地址tel:110,
          //解析该地址,获取电话号码, 然后跳转到本地打电话页面, 而不是加载网页, 从而实现了webView和本地代码的交互
                return true;
            }
        });
    }
}

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.loaderman.webviewdemo.MainActivity">

    <WebView
        android:id="@+id/wv_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

 添加网络权限:

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

 效果图:

运行就直接打开网页百度首页面

直接看日志:

技术分享

技术分享

 


WebView的应用场景

  WebView的应用场景我们无需多讲, 此处我只提一点: 随着html5的普及, 很多app都会内嵌webview来加载html5页面, 而且h5做的和app原生控件极其相似, 那么我们如何辨认某个页面使用h5做的还是用原生控件做的呢?
  打开开发者选项, 你会看到这样一个选项:显示布局边界

技术分享

勾选之后,所有原生控件布局的边框都会显示出来

技术分享

我们现在在这种状态下打开一个WebView看一眼(这是微信钱包-滴滴出行的页面)

技术分享

如果是WebView的话, 只有在WebView边缘才会显示一个边框, WebView内部是没有边框的;如果是原生控件,怎么可能边框这么少呢? 从而我们可以断定,微信的滴滴出行页面一定是用WebView加载网页实现的, 而不是系统原生控件.

 

WebView的用法