【发布时间】:2012-11-27 19:57:55
【问题描述】:
我正在使用 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");
到目前为止一切顺利。我现在可以从 JavaScript 中访问window.myClass.createMyDialog()。 然而,我想做的是传递一个回调,该回调将使用which 变量作为参数调用。这意味着有一个像
public void createMyDialog (final String callback)
并用类似的东西调用它
window.myClass.createMyDialog(
function (which) {
alert(which);
}
);
我可以将函数作为字符串传递(在函数周围使用String())并从Java 调用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 并使用_this.myVar = which 或使用bind)作为this 的上下文完全丢失,因为该函数将从 Java 调用。
我知道它必须是可能的,因为 PhoneGap 框架提供了navigator.notification.confirm,它几乎完全符合我的要求。怎么走?
提前致谢!
【问题讨论】:
-
我不太明白您是如何调用 createMyDialog()。在回调函数中,如果替换“this.myVar = which;”使用“console.log(which);”或“alert(which);”,你得到“which”的值了吗?
-
是的,
which的值被正确传递。目前的问题是我无法控制在哪个上下文中执行回调。我不能使用_this技巧,因为var _this = this;会为方法创建一个局部变量,但回调是在全局上下文中执行的。
标签: java javascript android cordova