2

Javascript コードから Java メソッドを呼び出そうとしています。これは、Phonegap を使用する Windows Phone 7 アプリ用です。

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

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

    }

そして、私のJavaコードには次のものがあります。

  public static native void exportStaticMethod() /*-{
    $wnd.onBackKeyDown = 
        $entry(this.@com.mycompany.myapp.client.MyApp::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();

    }

あなたの中にある EventListener を追加しているようです

public native void setupJavaHandler() /*-{
      var app = this;
      var onBackKeyDown = $entry(function() {
        app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
      });
      $doc.addEventListener("backbutton", onBackKeyDown, false);
    }-*/;

そのため、どこが間違っているのかわかりません。あなたが言及した ArrayList<> を追加しませんでした。確信が持てず、ページが読み込まれたときにイベントリスナーが実行されていなかったためです。

showSettingsWidgets()実行されることはないようです

4

1 に答える 1

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で行っていることと、ここで行っていることとのクロスが必要です。Java 関数を$entry呼び出しでラップし、それを に渡す$doc.addEventListenerのが最も理にかなっています (WP7 についてはよくわかりませんが)。

public static native void setupJavaHandler() /*-{
  var onBackKeyDown = $entry(this.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets());
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

もう 1 つ、ネイティブ コードで JavaScript を記述していることを思い出してください。thisそのhideSettingsWidgets()メソッドが呼び出されるとどうなるでしょうか。JavaScript は、すべての Java インスタンス メソッドを実行するために が必要であることを認識していませんthis(そして、JavaScript はオブジェクト A のメソッドを B で実行することに何の問題もありません -A.method.call(B)完全に合法であり、しばしば役に立ちます)。thisそれが私たちが考えていることを意味することを確認する必要があります。

public static native void setupJavaHandler() /*-{
  var app = this;
  var onBackKeyDown = $entry(function() {
    app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

編集:おっと、あなたのメソッドはとにかく静的であることが判明したので、this実際には何の意味もありません! exportStaticMethod/を非静的に変更setupJavaHandlerして直接呼び出すか (おそらく現在のように) 、前のサンプルで行っているようにonModuleLoadインスタンスを渡して呼び出します。hideSettingsWidgets()app

public native void setupJavaHandler() /*-{
  var app = this;
  var onBackKeyDown = $entry(function() {
    app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
// in onModuleLoad:
setupJavaHandler();

また

public static native void setupJavaHandler(MpApp app) /*-{
  //var app = this;
  var onBackKeyDown = $entry(function() {
    app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

// in onModuleLoad:
MyApp.setupJavaHandler(this);
于 2012-03-31T01:05:59.630 に答える