WebView包含基础的HTML显示功能, 使用时, 需要进行多方面的优化.
(1) 常用设置
(2) 网页客户端
(3) 浏览器客户端
(4) 滚动条
(5) 获取网页内容
Code:
package me.chunyu.Pedometer.base;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* 用于控制WebView的View
* 由于使用WebView的类型太多,如Activity,Fragment,DialogFragment等
* 因此将WebView的功能独立出来作为一个View
*
* @author MasaWong
* @author wangchenlong
*/
@SuppressWarnings({"unused", "WeakerAccess"})
public class PedoWebView extends WebView {
private static final String TAG = "DEBUG-WCL: " + PedoWebView.class.getSimpleName();
@SuppressWarnings("SpellCheckingInspection")
private static final String JS_PROCESS_TAG = "HTMLOUT"; // 用于获得HTML的内容
// 用于获得HTML的内容, 固定格式{@link MyJavaScriptInterface}
private static final String HTML_CONTENT = "javascript:window." + JS_PROCESS_TAG
+ ".processHTML(‘<head>‘+document.getElementsByTagName(‘html‘)[0].innerHTML+‘</head>‘);";
private ReceivedTitleListener mReceivedTitleListener;
private PageFinishedListener mPageFinishedListener;
private ReceivedErrorListener mReceivedErrorListener;
private UrlLoadingListener mUrlLoadingListener;
private JsAlertListener mJsAlertListener;
public PedoWebView(Context context) {
super(context);
if (!isInEditMode())
init();
}
public PedoWebView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
if (!isInEditMode())
init();
}
public PedoWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// 资源显示
if (!isInEditMode())
init();
}
/**
* 构造函数,配置WebView
*/
@SuppressLint("AddJavascriptInterface")
public void init() {
// clearView() is deprecated, but onBackPressed returns to about:blank
//noinspection deprecation
clearView();
setWebViewClient();
setWebChromeClient();
setWebViewSettings();
setHorizontalScrollBarEnabled(false);
// 滚动条不占位
setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
addJavascriptInterface(new MyJavaScriptInterface(), JS_PROCESS_TAG);
}
/**
* 配置WebView参数
*/
@SuppressLint("SetJavaScriptEnabled")
protected void setWebViewSettings() {
WebSettings settings = getSettings();
// User settings
settings.setJavaScriptEnabled(true); // 允许弹窗
settings.setLoadsImagesAutomatically(true);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(false);
// Technical settings
settings.setSupportMultipleWindows(true); // 支持多窗口
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);
// 优先使用缓存
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
/**
* 配置WebViewClient来处理网页加载的各种状态
*/
protected void setWebViewClient() {
WebViewClient webClient = new WebViewClient() {
// 重定向会加载多次
@Override
public void onPageFinished(WebView view, String url) {
getSettings().setBlockNetworkImage(false);
if (mPageFinishedListener != null) {
mPageFinishedListener.overridePageFinished(view, url);
}
loadUrl(HTML_CONTENT); // 加载JS内容
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
if (mReceivedErrorListener != null) {
mReceivedErrorListener.overrideReceivedError(view, errorCode,
description, failingUrl);
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return mUrlLoadingListener != null &&
mUrlLoadingListener.overrideUrlLoading(view, url);
}
};
setWebViewClient(webClient);
}
/**
* 获得JS的内容
*/
class MyJavaScriptInterface {
@JavascriptInterface
@SuppressWarnings("unused")
public void processHTML(String html) {
Log.d(TAG, "咨询医生的H5页面: " + html);
}
}
/**
* 配置WebChromeClient来处理JsAlert,用于从网页取得一些复杂的数据
*/
protected void setWebChromeClient() {
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
if (mReceivedTitleListener != null) {
mReceivedTitleListener.onReceivedTitle(view, title);
}
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return mJsAlertListener != null &&
mJsAlertListener.overrideJsAlert(view, url, message, result);
}
};
setWebChromeClient(webChromeClient);
}
/**
* 加载Url
*
* @param url 需要加载的url
*/
@Override
public void loadUrl(String url) {
// 把图片加载放在最后来加载渲染
getSettings().setBlockNetworkImage(true);
super.loadUrl(url);
}
public void setReceivedTitleListener(ReceivedTitleListener receivedTitleListener) {
mReceivedTitleListener = receivedTitleListener;
}
public void setPageFinishedListener(PageFinishedListener pageFinishedListener) {
mPageFinishedListener = pageFinishedListener;
}
public void setReceivedErrorListener(ReceivedErrorListener receivedErrorListener) {
mReceivedErrorListener = receivedErrorListener;
}
public void setUrlLoadingListener(UrlLoadingListener urlLoadingListener) {
mUrlLoadingListener = urlLoadingListener;
}
public void setJsAlertListener(JsAlertListener jsAlertListener) {
mJsAlertListener = jsAlertListener;
}
public interface ReceivedTitleListener {
void onReceivedTitle(WebView view, String title);
}
public interface PageFinishedListener {
void overridePageFinished(WebView view, String url);
}
public interface ReceivedErrorListener {
void overrideReceivedError(WebView view, int errorCode, String description,
String failingUrl);
}
public interface UrlLoadingListener {
boolean overrideUrlLoading(WebView view, String url);
}
public interface JsAlertListener {
boolean overrideJsAlert(WebView view, String url, String message, JsResult result);
}
}
参考: http://www.pedant.cn/2014/09/10/webview-optimize-points/
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-09-28 23:39:39