Android與js互動,帶進度條的載入H5頁面
阿新 • • 發佈:2018-12-16
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); } }