欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Android,androidsdk

来源: 开发者 投稿于  被查看 18631 次 评论:238

Android,androidsdk


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/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关频道:

用户评论