2011-03-15 24 views
6

所以我知道還有其他文章解決同一個問題,我想我已經跟着他們去信,但唉,無濟於事。我試圖學習如何讓我的應用程序與JavaScript交互。我只是想能夠從我的JavaScript返回一個值到我的活動。
這裏是我的活動:Android-使用addJavaScriptInterface從Javascript返回一個值

public class JSExample extends Activity { 
WebView mWebView; 
String mString; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mWebView = (WebView)findViewById(R.id.mWebView); 
    mWebView.addJavascriptInterface(new ClsAccessor(), "accessor"); 
    String html = getAssetsContent("jsinterface.html"); 

    mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); 

// Log.d("YO!", mString);   
} 

private String getAssetsContent(String filename){ 
    ..... 
} 

private void closeStream(BufferedReader stream) { 
    ..... 
} 

class ClsAccessor{ 
    public void setValue(String value){ 
     JSExample.this.mString = value; 
    } 
} 

這裏是我的WebView包含我要運行的JavaScript加載HTML文件:

<!DOCTYPE html> 

<html> 
<head> 
    <script language="javascript"> 
     accessor.setValue('Hello!'); 
    </script> 
</head> 
<body> 
<h1>Testing</h1> 
</body> 
</html> 

這是行不通的。當我運行代碼「Log.d(」YO!「,mString);」取消註釋我得到一個空指針異常,這意味着JavaScript從未爲mString賦值。我究竟做錯了什麼?

+0

你運行了一個問題? – 2011-03-15 16:11:01

+0

哦,傻我。是的,我遇到了問題。當「Log.d(」YO!「,mString)」行被取消註釋時,我得到一個NullPointerException,這意味着mString從來沒有被賦值,這意味着javascript與java的綁定失敗。所以我做錯了什麼? – aamiri 2011-03-15 16:28:51

回答

3

這可能是不正確的,我將不得不仔細檢查,但它可能是由於基準丟失..

嘗試使你ClsAccessor參考成員一級..

public class JSExample extends Activity { 
    ... 
    ClsAccessor _accessor = new ClsAccessor(); 
    ... 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mWebView.addJavascriptInterface(_accessor, "accessor"); 
     ... 

另外,如果你一行一行地調試,setValue()有沒有在託管代碼中調用?

爲了什麼是值得的,我有代碼,正如我上面所描述的那樣,並且託管接口的腳本工作正常,但是我目前沒有位置來測試並查看是否沒有對類的引用也適用。

0

我通過在我的Webview類中使用onLoadResource來做到這一點。

Html頁面:

<html> 
<head> 
function Submit(){ 

     var username = $('#username').val(); 
     var urlNew = 'processing.php'; 
     urlNew = urlNew + '?' + 'username=' + username; 
     $('#submit').attr('href', urlNew); 

     return true; 
    } 
</head> 
<body> 
    <form> 
     <input id="username" name="username" type="text" /> 
     <a href="" id="submit" onclick="return Submit();" ><img src="images/button.png" /></a> 
    </form> 
</body> 
</html> 

所以後來我onLoadResource我聽那個網址:

public void onLoadResource(WebView view, String url) 
     { 
      if(url.contains("http://domain.com/processing.php")){ 

//process the url and suck out the data 

} 

這可能不是你所需要的,但也有原因,我不得不這樣做此這樣的方式可能會幫助你。另外請注意,我沒有做表格提交,我做了<a>提交,那是因爲onLoadResource不會提交表單提交。

編輯:This might help.

+0

我變得無效是變量onLoadResource錯誤,當我使用此片段的無效類型 – Rizvan 2012-03-12 13:11:39

+0

您的私有類中有onLoadResource YourWebViewClient擴展WebViewClient {}嗎? – bMon 2012-03-13 05:16:32

2

嘗試啓用您的WebView的javascript:

mWebview.getSettings().setJavaScriptEnabled(true);