Android-使用addJavaScriptInterface从Javascript返回一个值

时间:2011-03-15 16:03:52

标签: javascript android webview

所以我知道还有其他帖子解决了同样的问题,我想我已经跟着他们去了这封信但是唉也无济于事。我正在尝试学习如何让我的应用程序与JavaScript进行交互。我只是希望能够从我的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加载的html文件,其中包含我想要运行的javascript:

    <!DOCTYPE html>

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

这不起作用。当我用“Log.d(”YO!“,mString)运行代码时;”取消注释我得到一个空指针异常,这意味着javascript从未为mString赋值。我做错了什么?

3 个答案:

答案 0 :(得分:3)

这可能不正确,我将不得不仔细检查,但可能是因为参考丢失了..

尝试将ClsAccessor引用设为成员级别..

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

另外,如果您逐行调试,setValue()是否会在托管代码中调用?

对于它的价值,我的代码正如我上面所描述的那样,并且托管界面的脚本工作正常,但我目前无法测试并查看是否也没有对类的引用的工作原理。

答案 1 :(得分:2)

尝试在您的网络视图上启用javascript:

mWebview.getSettings().setJavaScriptEnabled(true);

答案 2 :(得分: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.