基于WebView的封装,支持原生和腾讯X5内核切换,支持下拉刷新和进度显示并且做了兼容判断

1.首先导入腾讯官方包 tbs_sdk_thirdapp_v2.5.0.1031_36880_sharewithdownload_obfs_20161107_154437.jar,最新的可以自行下载,地址http://x5.tencent.com/



2.自定义webview控件重写,ScrollWebView.java(腾讯X5)ScrollWebViewNative.java(安卓原生),下面直接贴代码

ScrollWebView.java

package view;

import android.content.Context;
import android.util.AttributeSet;

import java.util.Map;

/**
 * webview控件重写,解决setOnScrollChangeListener在api<23的时候不兼容问题
 * Created by TZG on 2016/11/17.
 */
public class ScrollWebView extends com.tencent.smtt.sdk.WebView{

    public interface ScrollViewListener {
        void onScrollChanged(com.tencent.smtt.sdk.WebView scrollWebView, int x, int y, int oldx, int oldy);

    }

    private ScrollViewListener scrollViewListener = null;

    public ScrollWebView(Context context) {
        super(context);
    }

    public ScrollWebView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public ScrollWebView(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }

    public ScrollWebView(Context context, AttributeSet attributeSet, int i, boolean b) {
        super(context, attributeSet, i, b);
    }

    public ScrollWebView(Context context, AttributeSet attributeSet, int i, Map<String, Object> map, boolean b) {
        super(context, attributeSet, i, map, b);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

}

ScrollWebViewNative.java

package view;

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;

/**
 * webview控件重写,解决setOnScrollChangeListener在api<23的时候不兼容问题
 * Created by TZG on 2016/11/18.
 */
public class ScrollWebViewNative extends WebView {

    public ScrollWebViewNative(Context context) {
        super(context);
    }

    public ScrollWebViewNative(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollWebViewNative(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface ScrollViewListener {
        void onScrollChanged(WebView ScrollWebViewNative, int x, int y, int oldx, int oldy);

    }

    private ScrollViewListener scrollViewListener = null;


    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

}

3.Activity活动封装,WebCoreActivity.java(腾讯X5),WebCoreNativeActivity.java(安卓原生),WebCoreJsInterface.java(JS通信类)

WebCoreActivity.java

package web;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;

import com.dykj.hongchunshu.R;
import com.tencent.smtt.export.external.interfaces.JsResult;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import butterknife.Bind;
import butterknife.ButterKnife;
import data.DataManager;
import tool.PUB;
import view.ScrollWebView;

/**
 * webview 基于腾讯X5内核
 * Created by TZG on 2016/11/17.
 */
public class WebCoreActivity extends AppCompatActivity {
    @Bind(R.id.sr_refresh)
    android.support.v4.widget.SwipeRefreshLayout srRefresh;
    private view.ScrollWebView tbsContent;
    //    private ProgressBar mPageLoadingProgressBar;
    private ProgressDialog mProgressDialog;
    private String InUrl = "http://m.baidu.com/";
    private String mTitle = "";
    private static final int MAX_LENGTH = 10;
    private Boolean ReturnAll = false;//多级返回支持

    private ImageView img_left;
    private TextView tv_title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.
                SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.
                SOFT_INPUT_STATE_HIDDEN);
        setContentView(R.layout.activity_webcore);
        ButterKnife.bind(this);


        runOnUiThread(new Runnable() {
            @Override
            public void run() {
 /*
         * QbSdk
         */
                QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

                    @Override
                    public void onViewInitFinished(boolean arg0) {
                        // TODO Auto-generated method stub
                        Log.e("apptbs", " onViewInitFinished is " + arg0);
                    }

                    @Override
                    public void onCoreInitFinished() {
                        // TODO Auto-generated method stub
                        Log.i("apptbs", " onCoreInitFinished is OK");

                    }
                };
                QbSdk.initX5Environment(getApplicationContext(), cb);
            }
        });


        tv_title = (TextView) this.findViewById(R.id.tv_title);
        img_left = (ImageView) this.findViewById(R.id.img_left);
        tbsContent = (view.ScrollWebView) this.findViewById(R.id.forum_context);

//        mPageLoadingProgressBar = (ProgressBar) this.findViewById(R.id.progressBar1);
        img_left.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ReturnAll) {
                    if (tbsContent.canGoBack()) {
                        tbsContent.goBack();// 返回前一个页面
                    } else {
                        finish();
                    }
                } else {
                    finish();
                }
            }
        });

        try {
            GetIntentData();
        } catch (Exception e) {
            e.printStackTrace();
        }

        initProgressBar();
        initData();

        //设置颜色,这里只需要单色刷新
        srRefresh.setColorSchemeResources(
//                android.R.color.holo_blue_bright,
//                android.R.color.holo_green_light,
//                android.R.color.holo_orange_light,
//                android.R.color.holo_red_light
                R.color.main
        );

        srRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                tbsContent.clearCache(true);
                initData();
            }
        });

        /**
         * 该方法解决了,webview滑动式未到顶部进行刷新,存在的BUG,通过判断是否存在页面需要刷新
         * 从而,解决刷新冲突 by tzg 20161117
         */
        srRefresh.setTag(true);
        tbsContent.setScrollViewListener(new ScrollWebView.ScrollViewListener() {
            @Override
            public void onScrollChanged(WebView scrollWebView, int x, int y, int oldx, int oldy) {
                PUB.tlog.d("y:" + y + "oldy:" + oldy);
                if (y == 0) {//滑动到顶部
                    if (Boolean.valueOf(srRefresh.getTag().toString()) == false) {
                        srRefresh.setEnabled(true);
                        srRefresh.setTag(true);
                    }
                } else {
                    if (Boolean.valueOf(srRefresh.getTag().toString()) == true) {
                        srRefresh.setEnabled(false);
                        srRefresh.setTag(false);
                    }
                }
            }
        });


    }

    /*
   * Intent方法接收
   * */
    private void GetIntentData() throws Exception {
        try {
            this.mTitle = getIntent().getStringExtra("title");
        } catch (Exception ex) {
            PUB.tlog.e(ex);
        }
        try {
            this.InUrl = getIntent().getStringExtra("url");
        } catch (Exception ex) {
            PUB.tlog.e(ex);
        }

        this.ReturnAll = getIntent().getBooleanExtra("returnall", false);//多级返回支持,默认不开启,该参数可不传递
    }


    private void initProgressBar() {
//        mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
//        mPageLoadingProgressBar.setMax(100);
//        mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar));

        if (DataManager.version <= 19) {
            mProgressDialog = new ProgressDialog(this, AlertDialog.THEME_HOLO_LIGHT);
        } else {
            mProgressDialog = new ProgressDialog(this, android.R.style.Theme_DeviceDefault_Light_Panel);
        }

        // mProgressDialog.setMessage("Loading...");
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgressDialog.setIndeterminate(true);
        // mProgressDialog.setCancelable(false);
        //mProgressDialog.show();

    }

    private void initData() {
        tbsContent.loadUrl(InUrl);

        WebSettings webSettings = tbsContent.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//        优先使用缓存,WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//        不使用缓存,WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

        tbsContent.addJavascriptInterface(new WebCoreJsInterface(this), "APP");
        tbsContent.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Intent intent;
                // 判断URL
                if (url.startsWith("http:") || url.startsWith("https:")) {
                    view.loadUrl(url);
                }
                // 调用拨号程序
                if (url.startsWith("tel:")) {
                    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(intent);
                }
                // 发送短信
                if (url.startsWith("sms:")) {
                    Uri uri = Uri.parse(url);
                    intent = new Intent(Intent.ACTION_SENDTO, uri);
                    intent.putExtra("sms_body", "");
                    startActivity(intent);
                }
                // 导航
                if (url.startsWith("geo:")) {
                    Uri uri = Uri.parse("geo:0,0?q=30.732993,120.756175,地址");
                    intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                }
                // 返回
                if (url.startsWith("go:")) {
                    if (url.startsWith("go:back")) {
                        if (tbsContent.canGoBack()) {
                            tbsContent.stopLoading();
                            tbsContent.goBack();
                        } else {//go:finish
                            finish();
                        }
                    }
                }

                return true;
            }

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                tbsContent.stopLoading();
                tbsContent.clearView();

                tbsContent.setVisibility(View.GONE);
                Log.e("error", "errorCode:" + errorCode + "  description:" + description + "  failingUrl:" + failingUrl);

                int Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert;
                int version = Build.VERSION.SDK_INT;
                if (version > 21) {
                    Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert;
                } else {
                    Theme = AlertDialog.THEME_DEVICE_DEFAULT_LIGHT;
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(WebCoreActivity.this, Theme);
                builder.setTitle("温馨提示");
                String msg = "";//"检测到状态异常,请联系开发者"+description + "[" + errorCode + "]";
                //if(errorCode==-2){
                msg = "状态异常,请联系管理员或检查网络后再重试!";
                //}
                builder.setMessage(msg);

                builder.setCancelable(false);
                builder.setPositiveButton("关闭", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        WebCoreActivity.this.finish();
                    }
                });
                builder.show();

            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                // TODO Auto-generated method stub

                Log.d("should", "request.getUrl().toString() is " + request.getUrl().toString());

                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

            }

        });
        tbsContent.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                if (InUrl == null) {
                    return;
                } else if (mTitle.equals("")) {
                    // !tbsContent.getUrl().equalsIgnoreCase(url)  &&
                    if (title != null && title.length() > MAX_LENGTH)
                        tv_title.setText(title.subSequence(0, MAX_LENGTH) + "...");
                    else
                        tv_title.setText(title);
                } else {
                    tv_title.setText(mTitle);
                }

            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                WebCoreJsInterface.Dialogshow(message);
                result.confirm();

                return true;
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                // TODO Auto-generated method stub
//                mPageLoadingProgressBar.setProgress(newProgress);

//                if (mPageLoadingProgressBar != null && newProgress != 100) {
//                    mPageLoadingProgressBar.setVisibility(View.VISIBLE);
                if (mProgressDialog != null && newProgress != 100) {
                    srRefresh.setRefreshing(false);
                    mProgressDialog.setMessage(newProgress + "%");
                    mProgressDialog.show();

                } else {
                    mProgressDialog.dismiss();// 请求成功,关闭ProgressDialog
                }

            }
        });

    }


    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onStop() {
        super.onStop();

    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (ReturnAll) {
            if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {
                tbsContent.goBack();// 返回前一个页面
                return true;
            }
        } else {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
                return true;
            }
        }


        return super.onKeyDown(keyCode, event);
    }

}

WebCoreNativeActivity.java

package web;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;

import com.dykj.hongchunshu.R;

import butterknife.Bind;
import butterknife.ButterKnife;
import data.DataManager;
import tool.PUB;
import view.ScrollWebViewNative;

/**
 * webview 基于安卓原生内核
 * Created by TZG on 2016/11/18.
 */
public class WebCoreNativeActivity extends AppCompatActivity {
    @Bind(R.id.sr_refresh)
    SwipeRefreshLayout srRefresh;
    private ScrollWebViewNative tbsContent;
    //    private ProgressBar mPageLoadingProgressBar;
    private ProgressDialog mProgressDialog;
    private String InUrl = "http://m.baidu.com/";
    private String mTitle = "";
    private static final int MAX_LENGTH = 10;
    private Boolean ReturnAll = false;//多级返回支持

    private ImageView img_left;
    private TextView tv_title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.
                SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.
                SOFT_INPUT_STATE_HIDDEN);
        setContentView(R.layout.activity_webcore_native);
        ButterKnife.bind(this);

        tv_title = (TextView) this.findViewById(R.id.tv_title);
        img_left = (ImageView) this.findViewById(R.id.img_left);
        tbsContent = (ScrollWebViewNative) this.findViewById(R.id.forum_context);

//        mPageLoadingProgressBar = (ProgressBar) this.findViewById(R.id.progressBar1);
        img_left.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ReturnAll) {
                    if (tbsContent.canGoBack()) {
                        tbsContent.goBack();// 返回前一个页面
                    } else {
                        finish();
                    }
                } else {
                    finish();
                }
            }
        });

        try {
            GetIntentData();
        } catch (Exception e) {
            e.printStackTrace();
        }

        initProgressBar();
        initData();

        //设置颜色,这里只需要单色刷新
        srRefresh.setColorSchemeResources(
//                android.R.color.holo_blue_bright,
//                android.R.color.holo_green_light,
//                android.R.color.holo_orange_light,
//                android.R.color.holo_red_light
                R.color.main
        );

        srRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                tbsContent.clearCache(true);
                initData();
            }
        });

        /**
         * 该方法解决了,webview滑动式未到顶部进行刷新,存在的BUG,通过判断是否存在页面需要刷新
         * 从而,解决刷新冲突 by tzg 20161117
         */
        srRefresh.setTag(true);
        tbsContent.setScrollViewListener(new ScrollWebViewNative.ScrollViewListener() {
            @Override
            public void onScrollChanged(android.webkit.WebView ScrollWebViewNative, int x, int y, int oldx, int oldy) {
                PUB.tlog.d("y:" + y + "oldy:" + oldy);
                if (y == 0) {//滑动到顶部
                    if (Boolean.valueOf(srRefresh.getTag().toString()) == false) {
                        srRefresh.setEnabled(true);
                        srRefresh.setTag(true);
                    }
                } else {
                    if (Boolean.valueOf(srRefresh.getTag().toString()) == true) {
                        srRefresh.setEnabled(false);
                        srRefresh.setTag(false);
                    }
                }
            }
        });


    }

    /*
   * Intent方法接收
   * */
    private void GetIntentData() throws Exception {
        try {
            this.mTitle = getIntent().getStringExtra("title");
        } catch (Exception ex) {
            PUB.tlog.e(ex);
        }
        try {
            this.InUrl = getIntent().getStringExtra("url");
        } catch (Exception ex) {
            PUB.tlog.e(ex);
        }

        this.ReturnAll = getIntent().getBooleanExtra("returnall", false);//多级返回支持,默认不开启,该参数可不传递
    }


    private void initProgressBar() {
//        mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
//        mPageLoadingProgressBar.setMax(100);
//        mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar));

        if (DataManager.version <= 19) {
            mProgressDialog = new ProgressDialog(this, AlertDialog.THEME_HOLO_LIGHT);
        } else {
            mProgressDialog = new ProgressDialog(this, android.R.style.Theme_DeviceDefault_Light_Panel);
        }

        // mProgressDialog.setMessage("Loading...");
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgressDialog.setIndeterminate(true);
        // mProgressDialog.setCancelable(false);
        //mProgressDialog.show();

    }

    private void initData() {
        tbsContent.loadUrl(InUrl);

        WebSettings webSettings = tbsContent.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//        优先使用缓存,WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//        不使用缓存,WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

        tbsContent.addJavascriptInterface(new WebCoreJsInterface(this), "APP");
        tbsContent.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Intent intent;
                // 判断URL
                if (url.startsWith("http:") || url.startsWith("https:")) {
                    view.loadUrl(url);
                }
                // 调用拨号程序
                if (url.startsWith("tel:")) {
                    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(intent);
                }
                // 发送短信
                if (url.startsWith("sms:")) {
                    Uri uri = Uri.parse(url);
                    intent = new Intent(Intent.ACTION_SENDTO, uri);
                    intent.putExtra("sms_body", "");
                    startActivity(intent);
                }
                // 导航
                if (url.startsWith("geo:")) {
                    Uri uri = Uri.parse("geo:0,0?q=30.732993,120.756175,地址");
                    intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                }
                // 返回
                if (url.startsWith("go:")) {
                    if (url.startsWith("go:back")) {
                        if (tbsContent.canGoBack()) {
                            tbsContent.stopLoading();
                            tbsContent.goBack();
                        } else {//go:finish
                            finish();
                        }
                    }
                }

                return true;
            }

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                tbsContent.stopLoading();
                tbsContent.clearView();

                tbsContent.setVisibility(View.GONE);
                Log.e("error", "errorCode:" + errorCode + "  description:" + description + "  failingUrl:" + failingUrl);

                int Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert;
                int version = Build.VERSION.SDK_INT;
                if (version > 21) {
                    Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert;
                } else {
                    Theme = AlertDialog.THEME_DEVICE_DEFAULT_LIGHT;
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(WebCoreNativeActivity.this, Theme);
                builder.setTitle("温馨提示");
                String msg = "";//"检测到状态异常,请联系开发者"+description + "[" + errorCode + "]";
                //if(errorCode==-2){
                msg = "状态异常,请联系管理员或检查网络后再重试!";
                //}
                builder.setMessage(msg);

                builder.setCancelable(false);
                builder.setPositiveButton("关闭", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        WebCoreNativeActivity.this.finish();
                    }
                });
                builder.show();

            }

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                // TODO Auto-generated method stub

                Log.d("should", "request.getUrl().toString() is " + request.getUrl().toString());

                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

            }

        });
        tbsContent.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                if (InUrl == null) {
                    return;
                } else if (mTitle.equals("")) {
                    // !tbsContent.getUrl().equalsIgnoreCase(url)  &&
                    if (title != null && title.length() > MAX_LENGTH)
                        tv_title.setText(title.subSequence(0, MAX_LENGTH) + "...");
                    else
                        tv_title.setText(title);
                } else {
                    tv_title.setText(mTitle);
                }

            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                WebCoreJsInterface.Dialogshow(message);
                result.confirm();

                return true;
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                // TODO Auto-generated method stub
//                mPageLoadingProgressBar.setProgress(newProgress);

//                if (mPageLoadingProgressBar != null && newProgress != 100) {
//                    mPageLoadingProgressBar.setVisibility(View.VISIBLE);
                if (mProgressDialog != null && newProgress != 100) {
                    srRefresh.setRefreshing(false);
                    mProgressDialog.setMessage(newProgress + "%");
                    mProgressDialog.show();

                } else {
                    mProgressDialog.dismiss();// 请求成功,关闭ProgressDialog
                }

            }
        });

    }


    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onStop() {
        super.onStop();

    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (ReturnAll) {
            if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {
                tbsContent.goBack();// 返回前一个页面
                return true;
            }
        } else {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
                return true;
            }
        }


        return super.onKeyDown(keyCode, event);
    }

}

WebCoreJsInterface.java

package web;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.telephony.TelephonyManager;
import android.webkit.JavascriptInterface;
import android.widget.Toast;

import com.dykj.hongchunshu.AlterPasswordActivity;
import com.dykj.hongchunshu.LoginActivity;
import com.dykj.hongchunshu.MainActivity;

/**
 * 自定义的Android代码和JavaScript代码之间的桥梁类
 * 
 * @title WebAppInterface.java
 * @author tongzhenggang
 * @e-mail tongzhenggang@126.com
 */
public class WebCoreJsInterface {
   private String str;
   private String mAppInfoFilePath, sdk, version, model, DeviceId;

   private static Context mContext;

   public WebCoreJsInterface(Context c) {
      mContext = c;
   }

   // 如果target 大于等于API 17,则需要加上如下注解
   // @JavascriptInterface
   @JavascriptInterface
   public void showToast(String toast) {
      Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show();

   }

   /*
    * 关闭当前activity
    */
   @JavascriptInterface
   public void finish(String toast) {
      ((Activity) mContext).finish();
      Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show();
   }

   /*
    * 关闭APP
    */
   @JavascriptInterface
   public void Close() {
      new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
            .setTitle("温馨提示")
            .setMessage("确定要退出么?")
            .setCancelable(true)
            .setPositiveButton("退出", new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {

                  MainActivity.activity.finish();
                  ((Activity) mContext).finish();

                  mContext.startActivity(new Intent(mContext, LoginActivity.class));//登陆
               }
            })
            .setNegativeButton("取消",null)
            .show();
   }


   @JavascriptInterface
   public String getDevice() {

      // 获取设备信息
      // sdk = android.os.Build.VERSION.SDK; // SDK号
      // version = android.os.Build.VERSION.RELEASE; // android系统版本号
      // model = android.os.Build.MODEL; // 手机型号
      // model = model.replace(" ", "").toLowerCase();// 小写转换去空格
      TelephonyManager manager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
      DeviceId = manager.getDeviceId().trim();// 设备编号

      str = DeviceId;
      return str;
   }

   /**
    * 客户端展示对话框
    *
    */
   @JavascriptInterface
   public static void Dialogshow(String Msg) {
      new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).setTitle("提示").setMessage(Msg)
            .setCancelable(true).setPositiveButton("朕知道了", null).show();
   }


   /**
    * 播放音频
    */
   @JavascriptInterface
   public static void Mp3play(String type, String url) {
      //调用系统播放器
      if (type.equals("0")) {
         Intent it = new Intent(Intent.ACTION_VIEW);
         it.setDataAndType(Uri.parse(url), "audio/MP3");
         ((Activity) mContext).startActivity(it);
      }
      //不调用播放器
      else {
         MediaPlayer mediaPlayer = new MediaPlayer();
         Uri uri = Uri.parse(url);
         mediaPlayer = MediaPlayer.create(mContext, uri);
         mediaPlayer.start();
      }
   }
   
   /**
    * 再次打开WebCoreActivity
    * @param title
    * @param Url
    */
   @JavascriptInterface
   public static void OpenWeb(String title, String Url) {
      // ToastUtil.show(mContext, "title:"+title+"Url:"+Url);
          
      //PUB.web(mContext, title, Url);

   }

   /**
    * 更改密码原生界面
    */
   @JavascriptInterface
   public void AlterPasswordActivity(){
      mContext.startActivity(new Intent(mContext, AlterPasswordActivity.class));
   }

}

4.webview访问封装

WebAction.java

package tool;

import android.app.Activity;
import android.content.Intent;

import data.DataManager;
import web.WebCoreActivity;
import web.WebCoreNativeActivity;

/**
 * webview方法封装,如果安卓4.4 sdk>19 ,则执行腾讯X5,否则使用原生webview
 * Created by TZG on 2016/11/17.
 */
public class WebAction {
    private Intent in;

    /**
     * web 封装访问1,可自定义控制
     * @param activity 活动
     * @param title 标题,传空则自动读取页面标题
     * @param Url 网址
     * @param returnAll 是否支持多级返回操作
     */
    public WebAction(Activity activity, String title, String Url, Boolean returnAll){
        if (DataManager.version <= 19) {
            in = new Intent(activity, WebCoreNativeActivity.class);
        }else{
            in = new Intent(activity, WebCoreActivity.class);
        }

        in.putExtra("title", title);
        in.putExtra("url", Url);
        in.putExtra("returnall", returnAll);//是否支持多级返回操作

        activity.startActivity(in);
    }

    /**
     * web 封装访问2,不支持多级返回
     * @param activity 活动
     * @param title 标题,传空则自动读取页面标题
     * @param Url 网址
     */
    public WebAction(Activity activity,String title,String Url){
        if (DataManager.version <= 19) {
            in = new Intent(activity, WebCoreNativeActivity.class);
        }else{
            in = new Intent(activity, WebCoreActivity.class);
        }

        in.putExtra("title", title);
        in.putExtra("url", Url);
        in.putExtra("returnall", false);//不支持多级返回操作

        activity.startActivity(in);
    }

    /**
     * web 封装访问3,不支持多级返回且标题自动获取页面标题
     * @param activity 活动
     * @param Url 网址
     */
    public WebAction(Activity activity,String Url){
        if (DataManager.version <= 19) {
            in = new Intent(activity, WebCoreNativeActivity.class);
        }else{
            in = new Intent(activity, WebCoreActivity.class);
        }

        in.putExtra("title", "");//传空则自动读取页面标题
        in.putExtra("url", Url);
        in.putExtra("returnall", false);//不支持多级返回操作

        activity.startActivity(in);
    }
}

5.访问方法

3个方法调用。①支持自动title读取,②自定义title及直接返回,@自定义title,自定义返回(支持多及页面返回)。具体描述请参考4 的封装类注释说明

new WebAction(getActivity(),  "http://baidu.com/");
new WebAction(getActivity(), "测试一下", "http://baidu.com/");
new WebAction(getActivity(), "测试一下", "http://baidu.com/",true);


6.XML布局

activity_webcore.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="web.WebCoreActivity">

    <RelativeLayout
        android:id="@+id/rl_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/main">

        <ImageView
            android:id="@+id/img_left"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_centerVertical="true"
            android:paddingBottom="15dp"
            android:paddingLeft="5dp"
            android:paddingRight="10dp"
            android:paddingTop="15dp"
            android:src="@drawable/back_white" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="@string/loading"
            android:textColor="@color/white"
            android:textSize="20sp" />
    </RelativeLayout>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/sr_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <view.ScrollWebView
            android:id="@+id/forum_context"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:background="@color/whitesmoke"
            android:scrollbars="none">

            <ProgressBar
                android:id="@+id/progressBar1"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:visibility="gone" />

            <LinearLayout
                android:id="@+id/ll_loading"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/white"
                android:gravity="center"
                android:orientation="vertical"
                android:visibility="gone">

                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="300dp"
                    android:layout_height="100dp"
                    android:elevation="1dp"
                    app:srcCompat="@color/colorAccent" />
            </LinearLayout>

        </view.ScrollWebView>


    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>


activity_webcore_native.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="web.WebCoreActivity">

    <RelativeLayout
        android:id="@+id/rl_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/main">

        <ImageView
            android:id="@+id/img_left"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_centerVertical="true"
            android:paddingBottom="15dp"
            android:paddingLeft="5dp"
            android:paddingRight="10dp"
            android:paddingTop="15dp"
            android:src="@drawable/back_white" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="@string/loading"
            android:textColor="@color/white"
            android:textSize="20sp" />
    </RelativeLayout>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/sr_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <view.ScrollWebViewNative
            android:id="@+id/forum_context"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:background="@color/whitesmoke"
            android:scrollbars="none">

            <ProgressBar
                android:id="@+id/progressBar1"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:visibility="gone" />

            <LinearLayout
                android:id="@+id/ll_loading"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/white"
                android:gravity="center"
                android:orientation="vertical"
                android:visibility="gone">

                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="300dp"
                    android:layout_height="100dp"
                    android:elevation="1dp"
                    app:srcCompat="@color/colorAccent" />
            </LinearLayout>

        </view.ScrollWebViewNative>


    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>



  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值