我正在使用 HTML5/JavaScript 开发适用于 Android 的应用程序。遇到限制,我想从 JavaScript 中调用在 Java 代码中实现的函数。更准确地说,我想创建某种类型的对话框。这相当容易(我只会给出一个粗略的轮廓/存根):
public class MyClass () {
// other stuff
public void createMyDialog (/* arguments */) {
DialogBuilder builder = ...
builder.setItems(myItems, new DialogInterface.OnClickListener () {
@Override
public void OnClick (DialogInterface dialog, int which) {
droidGap.loadUrl(/* what now? */);
}
});
}
}
然后这个类被显示给 JavaScript
MyClass myClass = new MyClass();
appView.addJavascriptInterface(myClass, "myClass");
到现在为止还挺好。我现在可以window.myClass.createMyDialog()
从 JavaScript 中访问。但是,我想做的是传递一个回调,该回调将使用which
变量作为参数调用。这意味着有一个像
public void createMyDialog (final String callback)
并用类似的东西调用它
window.myClass.createMyDialog(
function (which) {
alert(which);
}
);
我可以让它工作,我将函数作为字符串传递(在函数周围使用)并从 JavaString()
调用。appView.loadUrl("javascript:(" + callback + ")(" + which + ");");
没关系,这个解决方案感觉不是很干净,它有一个很大的缺点 - 终于说到重点了。因为在 JavaScript 中,我实际上是createMyDialog
从一个类中调用的,我想做这样的事情:
function myJSClass () {
this.myVar = -1;
this.myFunc = function () {
window.myClass.createMyDialog(
function (which) {
this.myVar = which;
}
);
}
}
var myObj = new myJSClass();
myObj.myFunc();
现在的问题是,上面的解决方案this
将引用window
而不是类实例。这不是一个新问题,但是没有一个典型的解决方案(var _this = this
在调用之外存储和 using_this.myVar = which
或 using bind
)作为上下文this
完全丢失,因为该函数将从 Java 调用。
我知道这必须是可能的,因为 PhoneGap 框架提供navigator.notification.confirm
的功能几乎完全符合我的要求。去这里的路是什么?
提前致谢!