webview載入頁面,JS方法不能載入的問題解決
阿新 • • 發佈:2019-02-08
今天發現在webview,沒有辦法載入JS方法,跳不出那種提示框,就是寫了webview.getSettings().setJavaScriptEnabled(true); 這一句也完全沒用。後來發現網上說的解決方案是用要用到WebChromeClient ,並且重寫它裡面的幾個方法才行。
MyWebChromeClient.java
package com.example.webview_js; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnKeyListener; import android.graphics.Bitmap; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.webkit.JsPromptResult; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.EditText; /** 17. * http://618119.com/archives/2010/12/20/199.html 18. */ //**************************************************************************** public class MyWebChromeClient extends WebChromeClient { @Override public void onCloseWindow(WebView window) { super.onCloseWindow(window); } @Override public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { return super.onCreateWindow(view, dialog, userGesture, resultMsg); } /** * 覆蓋預設的window.alert展示介面,避免title裡顯示為“:來自file:////” */ public boolean onJsAlert(WebView view, String url, String message, JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("對話方塊") .setMessage(message) .setPositiveButton("確定", null); // 不需要繫結按鍵事件 // 遮蔽keycode等於84之類的按鍵 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) { Log.i("onJsAlert", "keyCode==" + keyCode + "event="+ event); return true; } }); // 禁止響應按back鍵的事件 builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); result.confirm();// 因為沒有繫結事件,需要強行confirm,否則頁面會變黑顯示不了內容。 return true; // return super.onJsAlert(view, url, message, result); } public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) { return super.onJsBeforeUnload(view, url, message, result); } /** 67. * 覆蓋預設的window.confirm展示介面,避免title裡顯示為“:來自file:////” 68. */ public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("對話方塊") .setMessage(message) .setPositiveButton("確定",new OnClickListener() { public void onClick(DialogInterface dialog,int which) { result.confirm(); } }) .setNeutralButton("取消", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); builder.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { result.cancel(); } }); // 遮蔽keycode等於84之類的按鍵,避免按鍵後導致對話方塊訊息而頁面無法再彈出對話方塊的問題 builder.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) { Log.v("onJsConfirm", "keyCode==" + keyCode + "event="+ event); return true; } }); // 禁止響應按back鍵的事件 // builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); return true; // return super.onJsConfirm(view, url, message, result); } /** 108. * 覆蓋預設的window.prompt展示介面,避免title裡顯示為“:來自file:////” 109. * window.prompt('請輸入您的域名地址', '618119.com'); 110. */ public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("對話方塊").setMessage(message); final EditText et = new EditText(view.getContext()); et.setSingleLine(); et.setText(defaultValue); builder.setView(et) .setPositiveButton("確定", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(et.getText().toString()); } }) .setNeutralButton("取消", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); // 遮蔽keycode等於84之類的按鍵,避免按鍵後導致對話方塊訊息而頁面無法再彈出對話方塊的問題 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) { Log.v("onJsPrompt", "keyCode==" + keyCode + "event="+ event); return true; } }); // 禁止響應按back鍵的事件 // builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); return true; // return super.onJsPrompt(view, url, message, defaultValue, // result); } @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); } @Override public void onReceivedIcon(WebView view, Bitmap icon) { super.onReceivedIcon(view, icon); } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); } @Override public void onRequestFocus(WebView view) { super.onRequestFocus(view); } }
在載入URL前寫上這兩行,應用上去
MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
webview.setWebChromeClient(myWebChromeClient);
MyWebChromeClient.java 適用性蠻大的,我沒改就OK了