WebSettings webSettings = native_web.getSettings(); //无缓存模式加载(可以解决h5 css内高度控制失败问题) webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
native_web.getSettings().setDomStorageEnabled(true); native_web.getSettings().setBlockNetworkImage(false);
webSettings.setJavaScriptEnabled(true);//android 与 h5约定的互通 "android" 为 tagnative_web.addJavascriptInterface(new JsInterface(), "android");// 设置拦截js中的三种弹框native_web.setWebChromeClient(new MyWebChromeClien());
// 监听点击的每一个url,做自己的特殊处理用 native_web.setWebViewClient(new MyWebViewClient());
native_web.loadUrl(webUrl);
/** * 监听 所有点击的链接,如果拦截到我们需要的,就跳转到相对应的页面。 */ private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("webview", "url===>" + url); try { // 如果url满足某种特定的格式,则进行特殊处理 if (url.contains("http://")) { view.loadUrl(url); } else { view.loadUrl(url); } return true; } catch (Exception e) { return true; } } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.d("webview", "onPageStartedurl===>" + url); urlNow = url; } }
/** * 拦截js的提示框 */ private class MyWebChromeClien extends WebChromeClient { // 提示框 @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { // new AlertDialog.Builder(MyWebViewActivity.this).setMessage(message) // .setPositiveButton("确定", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // // 当弹出框点击的时候,手动用代码给js返回确认的信息 // result.confirm("true"); // } // }).setNegativeButton("取消", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // result.cancel(); // } // }).show(); Navigator.startMyCardActivity(MyWebViewActivity.this, "我的产品"); // 返回false会弹出原声dialog,这里不让原声的弹出 return true; } // 警告框 @SuppressLint("NewApi") @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { return true; } // 确认框 @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MyWebViewActivity.this).setMessage(message) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 当弹出框点击的时候,手动用代码给js返回确认的信息 result.confirm(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).show(); return true; } }
/** * 对应js中的调用方法 */ public class JsInterface { // 关闭当前页面 @JavascriptInterface public void finish(){ MyWebViewActivity.this.finish(); } }
遇到的问题:
1.android 8.0 需要 return false 来重定向否则 wenview.cangoback() 方法会失效.
mWebContent.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Build.VERSION.SDK_INT < 26) { view.loadUrl(url); Toast.makeText(SimpleWebActivity.this, "重定向,返回:true", Toast.LENGTH_SHORT).show(); Toast.makeText(SimpleWebActivity.this, "版本号: "+Build.VERSION.SDK_INT + " " + "型号: " + Build.MODEL, Toast.LENGTH_LONG).show();
return true; } return false;