2012-03-30 9 views
2

JavaScriptメソッドからJavaメソッドを呼び出そうとしています。これは、Phonegapを使用しているWindows Phone 7アプリ用です。GWT JSNI javascript to Javaが動作しない

私のjavascriptコードには次のものがあります。

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

    } 

そして、私のJavaコードで、私は次のことを持っています。そして、onModuleLoad上で

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

    }-*/; 

は()私はそうのようにそれを呼び出しています:

MyApp.exportStaticMethod(); 

は、それは私がhideSettingsWidgets()でアラートを持っていますが、それは決して示さなかっます動作しません。

* EDIT * は、ここではいくつかのより多くのコードです。 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); 
    }-*/; 

は、だから私はわからないの内側にあるのEventListenerを追加しているように見えるん。 ArrayList <を追加しませんでした。なぜなら、ページがロードされたときにイベントリスナーが実行されていなかったからです。

addEventListenerコードはおそらく正しい、ページのロード時実行されている?

答えて

2

を実行することは決してありませんshowSettingsWidgets()のように思えますか空の関数onBackKeyDownがバックボタンイベントにマップされます。あなたのモジュールがロードされたら、のように再定義しようとします。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を書いていることを、何がそのhideSettingsWidgets()メソッドが呼び出されたときthisになるだろうか? JavaScriptでは、すべてのJavaインスタンスメソッドが実行するのにthisが必要であることはわかりません(B-A.method.call(B)ではオブジェクトAのメソッドを実行するにはJavaScriptが問題ありません)。私たちは、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に電話してください(前のサンプルでappと同じように、hideSettingsWidgets()を呼び出してインスタンスを渡してください)。

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

+0

また、ホストされたhtmlページに空のonBackKeyDown関数が必要なのは確実ですか? – james

+0

正常に動作している必要があります。 GWT Phonegapをダウンロードしたところ、同じことをしています。 IEのモバイルがJSNIを完全にサポートしていないと、私は驚かないでしょう。 – james

関連する問題