2012-03-30 60 views
2

我想从我的Javascript代码调用Java方法。这是使用Phonegap的Windows Phone 7应用程序。GWT JSNI JavaScript到Java不工作

我在我的JavaScript代码中有以下内容。

document.addEventListener("backbutton", onBackKeyDown, false); 
function onBackKeyDown(){ 

    } 

而在我的Java代码中,我有以下几点。

public static native void exportStaticMethod() /*-{ 
    $wnd.onBackKeyDown = 
     $entry([email protected]::hideSettingsWidgets()); 

    }-*/; 

然后在上onModuleLoad()我调用它像这样:

MyApp.exportStaticMethod(); 

它不工作,我在hideSettingsWidgets()的警报,但它从来没有得到显示。

* 编辑 * 下面是一些更多的代码。 EventListener不会在Javascript中添加。它专门添加了Java代码。我无法让听众原本注册,所以这是我添加的内容。

public static native void removeBackListener() /*-{ 
    $wnd.removeTheListener(); 
}-*/; 

而且在我的JavaScript

function removeTheListener(){ 
     document.removeEventListener("backbutton", onBackKeyDown, false); 

     } 

这是我的呼吁hideSettingsWidgets()

public void hideSettingsWidgets(){ 
     for(int i=0;i<settingsScreenWidgets.length;i++){ 
      settingsScreenWidgets[i].setVisible(false); 
     } 
     alertString("Working"); 
     removeBackListener(); 



    } 

而且我给你打电话给我里面showSettingsWidgets()

p

方法
rivate void showSettingsWidgets(){ 
     for(int i=0;i<settingsScreenWidgets.length;i++){ 
      settingsScreenWidgets[i].setVisible(true); 
     } 
     setCurrentImage(); 
     setOnOffImage(); 
     setupJavaHandler(); 

    } 

它似乎被添加事件侦听就是里面你

public native void setupJavaHandler() /*-{ 
     var app = this; 
     var onBackKeyDown = $entry(function() { 
     [email protected]::hideSettingsWidgets(); 
     }); 
     $doc.addEventListener("backbutton", onBackKeyDown, false); 
    }-*/; 

所以我不知道我要去的地方错了。我没有添加您提到的ArrayList <>因为不确定,并且页面被加载时Event Listener未运行。

好像showSettingsWidgets()永远不会被运行

回答

2

addEventListener代码可能运行在页面加载时,对不对?这会将您的空函数onBackKeyDown映射到backbutton事件。然后,当你的模块加载时,你试图重新定义onBackKeyDown功能是一个新的 - 但老的已经附加到你试图听的事件。

这大致是这样的当量(以字符串而非听者功能):

// first, make the thing to hold the 'listener', and define the first one 
List<String> strings = new ArrayList<String>(); 
String onBackKeyDown = "abcd"; 
strings.add(onBackKeyDown); 

// then, redefine the string, but don't change the list! 
onBackKeyDown = "zyxw"; 

assert strings.contains(onBackKeyDown) : "Whoops, reassigned, but not added!"; 

要解决这个问题,你需要在你的其他问题,Adding Eventlisteners to document with GWT JSNI在做什么之间的交叉,和你在这里做。在调用$entry调用中包装Java函数,并将其传递给$doc.addEventListener是最合理的(尽管我对WP7了解不多)。

public static native void setupJavaHandler() /*-{ 
    var onBackKeyDown = $entry([email protected]::hideSettingsWidgets()); 
    $doc.addEventListener("backbutton", onBackKeyDown, false); 
}-*/; 

一件事 - 记住,我们是在本机代码编写JavaScript,什么将是thishideSettingsWidgets()方法被调用? JavaScript不知道所有的Java实例方法都需要运行this(并且JavaScript没有问题B上的对象A的运行方法 - A.method.call(B)是完全合法的,并且通常很有用)。我们需要确保this意味着什么,我们认为它的作用:

public static native void setupJavaHandler() /*-{ 
    var app = this; 
    var onBackKeyDown = $entry(function() { 
    [email protected]::hideSettingsWidgets(); 
    }); 
    $doc.addEventListener("backbutton", onBackKeyDown, false); 
}-*/; 

编辑:哎呀,原来你的方法是静态的,无论如何,所以this实际上并不意味着什么!将exportStaticMethod/setupJavaHandler更改为非静态并直接调用(可能在您的onModuleLoad中,就像您现在使用的那样),或者通过实例传递hideSettingsWidgets(),就像我们在前面的示例中使用app一样。

public native void setupJavaHandler() /*-{ 
    var app = this; 
    var onBackKeyDown = $entry(function() { 
    [email protected]::hideSettingsWidgets(); 
    }); 
    $doc.addEventListener("backbutton", onBackKeyDown, false); 
}-*/; 
// in onModuleLoad: 
setupJavaHandler(); 

public static native void setupJavaHandler(MpApp app) /*-{ 
    //var app = this; 
    var onBackKeyDown = $entry(function() { 
    [email protected]::hideSettingsWidgets(); 
    }); 
    $doc.addEventListener("backbutton", onBackKeyDown, false); 
}-*/; 

// in onModuleLoad: 
MyApp.setupJavaHandler(this); 
+0

嗨。当页面加载时,addEventListener代码不会被添加或运行,而是专门添加到java代码中。我也通过调用一个javascript函数来删除它。我已经在上面添加了我的相关代码。谢谢您的帮助。 – james 2012-03-31 02:04:07

+0

也只是为了确保我仍然需要托管的HTML页面中的空onBackKeyDown函数? – james 2012-03-31 03:46:45

+0

它必须是正确的。我下载了GWT Phonegap,它也在做同样的事情。如果手机上的IE浏览器完全不支持JSNI,我不会感到惊讶。 – james 2012-03-31 04:41:24