今天發現在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);
這樣就可以了。文章借見:http://www.imooo.com/web/web/962004.htm
MyWebChromeClient.java 適用性蠻大的,我沒改就OK了