1

我正在使用 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的功能几乎完全符合我的要求。去这里的路是什么?

提前致谢!

4

1 回答 1

1

首先,你真的应该写一个 Plugin。我们已经遇到了许多 Java/JS 和 JS/Java 问题,因此您应该利用我们测试过的代码。

其次,您将需要在 UI 线程上运行您的对话框。如果你不这样做,就会有问题。

第三,如果您想在发生对话操作时从 Java 调用特定的成功/错误回调,您可以通过 PluginResult 类来实现。如果设置成功条件,将调用成功回调,反之亦然。

查看 PG 代码以获取通知,其中包含许多对话框的示例:

https://git-wip-us.apache.org/repos/asf?p=cordova-android.git;a=blob;f=framework/src/org/apache/cordova/Notification.java;h=958ab26b842b41326523b9fa154aa8c71885c8ab; hb=头

于 2012-11-28T05:41:10.067 回答