我遇到了类似的问题:在网络应用程序中,我想使用本机Android确认对话框。这意味着我必须从Android回调到Javascript部分,并给出确认对话框的结果。
我按如下方式解决了这个问题:
function foo() {
// user confirmation needed
var dataString = <encode data into string>;
MyClient.showConfirmationDialog('myCallBackFunction', dataString, 'A title', 'A message');
}
上面的代码调用Android javascript接口(见下文)。javascript提供了回调方法,其名称作为参数传递给Android(以及数据字符串,标题和消息)。回调函数如下所示:myCallbackFunction()
function myCallbackFunction(dataString, result) {
var data = <decode data from dataString>;
if (result) {
// user has confirmed
} else {
// user has denied
}
}
在 Android 方面,我首先在 Activity 的方法中激活 Javascript 接口:onCreate()
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView = new WebView(this);
setContentView(webView);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavascriptInterface(webView), "MyClient");
}
然后,实现将创建相应的 Android 对话框,并将结果传递回 javascript:MyJavascriptInterface
WebView webView;
public MyJavascriptInterface(WebView w) {
this.webView = w;
}
@JavascriptInterface
public void showConfirmationDialog(final String callbackFunction, final String data, String title,
String message) {
Dialog.OnClickListener positiveListener = new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
webView.loadUrl("javascript:" + callbackFunction + "('" + data + "', true)");
}
};
Dialog.OnClickListener negativeListener = new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
webView.loadUrl("javascript:" + callbackFunction + "('" + data + "', false)");
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(title).setMessage(message).setPositiveButton("Ok", positiveListener)
.setNegativeButton("Cancel", negativeListener).setCancelable(false);
builder.create().show();
}
将回调函数的名称传递给Android允许使用多个调用确认对话框,每个对话都配备了自己的函数来执行实际操作。数据字符串将携带执行操作所需的所有数据(甚至可以包含 Json 编码的对象)。