1. 程式人生 > >Android與js互動,帶進度條的載入H5頁面

Android與js互動,帶進度條的載入H5頁面

    private void initWebView() {
        WebSettings settings = wvResumeDetail.getSettings();
        //支援JavaScript指令碼語言
        settings.setJavaScriptEnabled(true);
        //允許WebView訪問檔案資料
        settings.setAllowFileAccess(true);
        // 支援內容縮放控制
        settings.setBuiltInZoomControls(false);
        //編碼格式
        settings.setDefaultTextEncodingName("UTF-8");
        //設定自適應螢幕
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        //設定可以使用
        settings.setDomStorageEnabled(true);
        //應用可以有資料庫
        settings.setDatabaseEnabled(false);
        //應用可以有快取
        settings.setAppCacheEnabled(false);

        wvResumeDetail.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && wvResumeDetail.canGoBack()) {
                    wvResumeDetail.goBack();
                    return true;
                }
                return false;
            }
        });
        wvResumeDetail.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
            }

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

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.contains("tel:")) {
                    String mobile = url.substring(url.lastIndexOf("/") + 1);
                    CommonUtil.call(context, mobile.substring(4, mobile.length()));
                    //這個超連線,java已經處理了,webview不要處理了
                    return true;
                } else if (url.contains("mailto:")) {
                    CallUtil.mail(context, url);
                } else {
                    view.loadUrl(url);
                }
                return true;
            }
        });
        wvResumeDetail.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                //有的手機不走此方法,故在onPageFinished中也添加了設定
            }

            /** 載入資料的進度變化 */
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (pbResumeDetail != null) {
                    if (newProgress != 100) {
                        pbResumeDetail.setVisibility(View.VISIBLE);
                    }
                    pbResumeDetail.setProgress(newProgress);

                    if (pbResumeDetail.getProgress() == 100) {
                        final Timer timer = new Timer();
                        TimerTask task = new TimerTask() {
                            public void run() {
                                Message message = new Message();
                                message.what = 1;
                                progressHandler.sendMessage(message);
                                timer.cancel();
                            }
                        };
                        timer.schedule(task, 500);
                    }
                }

                super.onProgressChanged(view, newProgress);
            }

            /** 處理HTML的對話方塊 */
            @Override
            public boolean onJsConfirm(WebView view, String url,
                                       String message, final JsResult result) {
                showDialog(message, result);
                return true;
            }

        });
//Android與Js的互動,js程式設計師會通過AndroidWebView標識返回事件
        wvResumeDetail.loadUrl(url);
        wvResumeDetail.addJavascriptInterface(new JavaScriptInterface(this), "AndroidWebView");

    }

    public class JavaScriptInterface {
        Context mContext;

        JavaScriptInterface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public void setShareData(String data) {
            Evaluate evaluate = JsonUtil.fromJson(data, Evaluate.class);
            if (evaluate != null) {
                js2evaluate = evaluate;
            }
        }
    }

    private Handler progressHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int msgId = msg.what;
            if (msgId == 1) {
                if (pbResumeDetail != null) {
                    pbResumeDetail.setVisibility(View.GONE);
                }
            }
        }
    };

    private void showDialog(String msg, final JsResult result) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(msg);
        builder.setTitle("提示");
        builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                result.confirm();
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                result.cancel();
            }
        });
        builder.create().show();
    }

    public static void startAction(Context context, String id) {
        Intent intent = new Intent(context, SuccessCaseDetailActivity.class);
        intent.putExtra("id", id);
        context.startActivity(intent);
    }
}