2012-03-30 43 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