2011-05-07 79 views
4

我試圖在JavaScript中調用java中的方法,但是當我在模擬器中運行應用程序時,不會發生這種情況,應用程序會在它調用java中的方法時停止。
這裏是Java代碼:將JavaScript代碼綁定到Android代碼

import android.os.Bundle; 
import android.webkit.WebView; 
import com.phonegap.*; 

public class App extends DroidGap { 
    WebView webView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     webView = new WebView(this); 
     webView.addJavascriptInterface(new message(), "Show"); 
     super.loadUrl("file:///android_asset/www/index.html"); 
    } 

    class message { 
     String msg() { 
      return "Hello World!!"; 
     } 
    } 
} 


這裏是JavaScript:

<script type="text/javascript"> 
{ 
    alert("Start"); 
    alert(Show.msg()); 
    alert("End");  
} 
</script> 

它顯示了一個警報,但沒有後,任何人都可以幫忙嗎?

回答

4

你的問題是,你有一半使用PhoneGap和一半沒有。您正在從PhoneGap創建一個單獨的WebView類。您添加「顯示」的WebView類永遠不會被使用。相反,WebView類是superDroidGap)的成員。

你應該做兩件事之一。

  • 使用的PhoneGap的插件結構(見例子here
  • 都不要使用PhoneGap的,並有一個類,看起來更像如下:

    public class act extends Activity { 
        WebView webView; 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         webView = new WebView(this); 
         webView.getSettings().setJavaScriptEnabled(true); 
    
         // Set JS alert() hook 
         webView.setWebChromeClient(new WebChromeClient() { 
          public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
          { 
           return false; 
          } 
          });  
    
         webView.loadUrl("file:///android_asset/www/index.html"); 
    
         // Add JS libraries 
         webView.addJavascriptInterface(new message(), "Show"); 
        } 
    
        class message { 
         public String msg() { 
          return "Hello World!!"; 
         } 
        } 
    } 
    

注意,方法msg需要是public

+0

謝謝,我明白你的意思了......所以我認爲用tcp \ ip客戶端替換消息類並讓它與桌面計算機上的服務器進行通信是有道理的?我打算爲此使用wifi,並且我已經使用android設備上的telnet應用程序測試了連接,通信完美無缺。 – 2011-05-08 19:48:48

+0

我相信如此。你應該能夠在消息類中放入你想要的任何Android本地代碼。 – 2011-05-08 19:52:45

+0

@PaulBeusterien在'JsResult'面臨錯誤爲什麼這個 – NagarjunaReddy 2013-04-19 07:26:18

0

爲什麼不直接使用AlertDialog?

private void showDialog(int title, String message) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle(title); 
    builder.setMessage(message); 
    builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
     } 
    }); 
    builder.show(); 
} 
+0

我只使用示例中的alert(String)方法來檢查java和javascript之間的交互是否正常,在我正在編寫的應用程序中,我想要調用不同的方法,每個方法執行不同的操作並返回不同的類型。 – 2011-05-08 03:45:19