WebView无法调用JavaScript函数

时间:2015-09-12 20:10:53

标签: javascript android webview

我已尝试过所有内容但仍然无效,请帮助:

我在这里设置我的WebView:

public class MainActivity extends ActionBarActivity {
    private WebView mWebView;
    private MyWebViewClient mWebViewClient;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mWebViewClient = new MyWebViewClient(context);
        mWebView = (WebView) findViewById(R.id.activity_main_webview);
        mWebView.addJavascriptInterface(mWebViewClient, "Android");
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        webSettings.setDomStorageEnabled(true);
        mWebView.setWebViewClient(mWebViewClient);
        mWebView.loadUrl("file:///android_asset/index.html");
    }
}

这是我从JS调用我的函数的地方:

    <script>
            $("#logInButton").click(function(){
                if(isAndroid){
                    Android.onJavaLogIn();
                }
                return false;
            });
    </script>
    <input type="button" value="Log In" id="logInButton" />

以下是我的处理方式:

public class MyWebViewClient extends android.webkit.WebViewClient {
    private MainActivity context;

    public MyWebViewClient(MainActivity context) {
        this.context = context;
    }
    @JavascriptInterface
    public void onJavaLogIn(){
        context.onMainLogIn();
    }

}
public class MainActivity extends ActionBarActivity {
    public void onMainLogIn(){
        mWebView.loadUrl("javascript:onJSLogIn();");
    }
}

这是它要调用的JS函数:

    <script>
        function onJSLogIn(){
            $("#logInButton").hide();
            $("#logOutButton").show();
        }
    </script>

整个链似乎是正确的,我通过调试验证MainActivity中的onMainLogIn()是否被调用,但JS函数onJSLogIn()永远不会被调用,为什么?

2 个答案:

答案 0 :(得分:1)

事实证明,WebView仅适用于主UI线程。所以我不得不像这样扭曲调用函数:

public void onMainLogIn(){
    this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mWebView.loadUrl("javascript:onJSLogIn();");
        }
    });
}

答案 1 :(得分:0)

是的,这里一切都很好。由于我们无法调试它,我们只能提出一些建议。

1.首先在onJSLogIn JS方法中写一个警报,以确保函数不被调用。因为logInButton,logOutButton dom元素可能没有已装入。

2.将您的webview连接到远程调试,并使用chrome ADB工具检查错误。