2011-08-17 111 views
0

我正在开发一个项目,关于在WebView演示之后在android上嵌入web应用程序,但是当javascript函数'wave'时需要调用gwt函数由Android应用程序回叫:如何在调用javascript函数时调用gwt函数

<html> 
    <script language="javascript"> 
     /* This function is invoked by the activity */ 
     function wave(s) { 
       // call a gwt function and 
       // pass 's' to the gwt function 
     } 
    </script> 
    <body> 
     <!-- Calls into the javascript interface for the activity --> 
     <a onClick="window.demo.clickOnAndroid()"><div style="width:80px; 
      ... 
     </div></a> 
    </body> 
</html> 

有关如何实现此目的的任何想法?

回答

5

您将需要将您想调用的任何方法从javascript导出到javascript全局范围中。这意味着你不能从手写javascript调用任意的java方法。您必须提前计划并在javascript范围内公开必要的方法。

过程是非常简单的:

  1. 编写创建于$ WND范围功能的JSNI方法。
  2. 从这个函数的主体调用java方法使用JSNI JavaScript to java syntax
  3. 在应用程序启动期间调用步骤#1中声明的方法(例如,从入门点onmoduleload)
  4. 调用在$ wnd作用域中创建的函数从您的javascript。确保在加载gwt模块并运行入口点后执行此操作。

GWT JSNI documentation与附加注释的例子:

package mypackage; 

public MyUtilityClass 
{ 
    //Method to be called from javascript, could be in any other class too 
    public static int computeLoanInterest(int amt, float interestRate, 
              int term) { ... } 
    //This method should be called during application startup 
    public static native void exportStaticMethod() /*-{ 
     //the function named here will become available in javascript scope 
     $wnd.computeLoanInterest = 
      $entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI)); 
    }-*/; 
} 

编辑:

将参数传递给Java方法:

当你调用Java方法需要参数ERS,从JavaScript,你需要使用一个特定的语法:

[instance-expr.]@class-name::method-name(param-signature)(arguments) 

例如,调用,需要一个字符串参数的静态方法是这样的:

@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s); 

需要注意的是,我们在呼唤一个静态方法,'实例表达式'。被省略。其余代码是完全合格的类名称,后跟::和方法名称。方法名称后面的Ljava/lang/String;指定我们需要调用以String对象为参数的方法。最后s是该参数的实际值。

请记住,在我们的例子中,参数签名Ljava/lang/String;在语法上使用JNI type signature specs,并且GWT编译器要求选择正确的方法,即使存在多个具有相同名称的重载方法。即使方法没有过载,也需要param-signature

+0

我的gwt应用程序现在可以接收来自硬写javascript的事件,但这是空参数。我需要将String传递给gwt函数作为它的参数,但是我不能在@entry中做到这一点,关于如何实现这一点的任何想法? – xybrek

+0

@xybrek查看更新的答案 –

1

GWT被编译为javascript,并且所有函数/对象名都被缩小了,所以它们变得不可读和未知,所以你不能直接从Javascript调用它们。要解决这个问题,你需要检查如何Call a Java Method from Handwritten JavaScript