如果只是想简单地使用 WebView,通过下面几步即可展示一般功能需求的 H5 页面。
-
在 AndroidManifest.xml 申请网络权限 -
在 XML 布局文件中添加 WebView 控件,并在 Java 代码中得到该 WebView 的对象
<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_webview_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
......
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
......
</LinearLayout>
// MainActivity.java @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@TargetApi(21)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
});
webView.loadUrl("https://ke.youdao.com");
}
-
如果访问的页面中含有 JavaScript 的代码,则需要设置 WebView 支持 Javascript。
webView.getSettings().setJavaScriptEnabled(true);
-
如果页面中含有连接,点击链接如果想继续在当前浏览器中浏览网页,则需要重写 WebView 的 WebViewClient 对象。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@TargetApi(21)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
});
如果不重写 WebView 的对象 WebViewClient,点击页面中的连接则会在手机系统自带的浏览器中打开新的链接。
2. WebViewClient
在第一节中已经简单使用过 WebViewClient 这个类,还有其他一些常用的方法可以重写并使用,其含义如下所示:
webView.setWebViewClient(new WebViewClient() {
// 给应用接管处理某些 url 请求的机会,返回 true 则拦截该请求,返回 false 不拦截,已经被废弃
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
// 给应用接管处理某些 url 请求的机会,返回 true 则拦截该请求,返回 false 不拦截,是上面方法的替代方法
// WebResourceRequest 中含有请求的 url,请求方法和请求头等信息
@TargetApi(21)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
// 页面开始加载时回调
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
// 页面结束加载时回调
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
// 在加载 url 对应的资源时会回调此方法
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
// 在加载 url 对应资源时会回调此方法,不同的是,可以通过返回值控制加载的数据。此方法已被废弃
// 若返回 null,WebView 会正常加载该资源
// 若返回 WebResourceResponse 类型的对象,则 WebView 会使用该对象
// 需要注意的是,此方法不在 UI 线程中被调用
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return super.shouldInterceptRequest(view, url);
}
// 是上面方法的替代方法,使用方法和上面方法一致
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
// 加载资源出错时会被回调的方法
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
// 加载资源时 HTTP 请求出错会回调此方法
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
}
// 请求 HTTPS 资源出错时会回调此方法
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
}
// 拦截浏览器中的按键事件
// 若返回 true,则拦截按键事件
// 若返回 false,则由 WebView 处理该事件
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
return super.shouldOverrideKeyEvent(view, event);
}
// 当页面的缩放比例发生变化时会回调此方法
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
}
});
3. WebChromeClient
同 WebViewClient 一样,通过为 WebView 设置 WebChromeClient 对象,并重写其中的一些方法可以对 WebView 的一些行为进行控制。
webView.setWebChromeClient(new WebChromeClient() {
// 网页的加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {
L.i("onProgressChanged " + newProgress);
super.onProgressChanged(view, newProgress);
}
// 接收到网页的 title
@Override
public void onReceivedTitle(WebView view, String title) {
L.i("onReceivedTitle " + title);
super.onReceivedTitle(view, title);
}
// 接收到网页的 icon
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
@Override
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {
super.onReceivedTouchIconUrl(view, url, precomposed);
}
// 当 H5 页面中点击播放的 flash video 的全屏按钮时,会调用这个方法
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
super.onShowCustomView(view, callback);
}
// 与 onShowCustomView() 对应的取消全屏时会调用的方法
@Override
public void onHideCustomView() {
super.onHideCustomView();
}
@Override
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
super.onShowCustomView(view, requestedOrientation, callback);
}
// http://www.cnblogs.com/ufreedom/p/4229590.html
// 当创建新的 Window 时会调用此方法
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
// 和 onCreateWindow() 方法对应的,关闭 Window
@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}
// 当 WebView 获取焦点时会调用此方法
@Override
public void onRequestFocus(WebView view) {
super.onRequestFocus(view);
}
// 在 Js 代码中弹出 Alert 窗口时会调用此方法
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
// 在 Js 代码中弹出 Confirm 窗口时会调用此方法
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
// 在 Js 代码中弹出 Prompt 窗口时会调用此方法
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
// 在 Js 加载之前会调用此方法
@Override
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
return super.onJsBeforeUnload(view, url, message, result);
}
// 打印 Js 中的日志 console 信息,被废弃
@Override
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
super.onConsoleMessage(message, lineNumber, sourceID);
}
// 打印 Js 中的日志 console 信息,被废弃
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
return super.onConsoleMessage(consoleMessage);
}
});
4. WebViewClient 和 WebChromeClient 的区别
|