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

aam*_*iri 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的WebView加载的html文件,其中包含我想要运行的javascript:

    <!DOCTYPE html>

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

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

Qui*_*son 3

这可能不正确,我必须仔细检查,但这可能是由于参考丢失了。

尝试将您的ClsAccessor推荐人设为会员级别。

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

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

就其价值而言,我的代码正在按照我上面的描述进行操作,并且托管接口的脚本工作正常,但是我目前无法测试并查看没有对该类的引用是否也可以工作。