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="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="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加载网页实现的, 而不是系统原生控件.