Wednesday, August 12, 2015

Android webview 无法调用Js 代码?



参考链接:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/

    昨天遇到一个问题: webview 无法调用 Js 的代码。真的是恶心的。
WebView  无法与 JS 交互。

在网络上搜了很久,我觉的还是相信自己的技术吧。别太相信百度了。Google 只是会给你一些建议啥的。但是每一个人的问题 有可能都是不一样的。




1 JS 无法调用我的代码?

注意的当Js 页面调用Android 的方法的时候:
window.android.reCal();

例如:
    $('body').css('overflow','hidden');    window.android.calculate();  //这里调用你的方法});

   
private void setWebViewJsInterface() {
    if(null == webViewJSInterface){
        webViewJSInterface = new WebViewJSInterface(this);        webViewJSInterface.setmWebViewJSCallBack(this);    }
    mWebviewCalculator.addJavascriptInterface(webViewJSInterface, "android");}

这是因为,在给webview.addJavascriptInterface() 的时候,这里注意一下判断。
再就是: WebViewJSInterface 中的方法注意:
/** * 点击计算 */@JavascriptInterfacepublic void calculate(){
    mWebViewJSCallBack.JSCallBack("calculate");}

Google 官网说 有的时候 没有调用是因为 JS 没有加载完成,细细想想也有可能
解决方案:
mWebviewCalculator.setWebChromeClient(new WebChromeClient(){
    @Override    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);    }

    @Override    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);    }
});

重写onJsAlert() 的方法。

解决;




2  但是当你去掉用页面的JS 的方法的时候,这个时候比较难找。因为 Js 本身的代码规范性就很有问题。所以,这个时候 你需要 前台的工程师的帮助。如果 是我自己的话,估计我得整个一两天了!

   我昨天无法调用的问题: 因为JS 定义的function 是局部方法,所以调用一次之后消亡了。所以,无法调用。  解决方案:
window.reCal = function(){
    result.css('left','200%');    result[0].scrollTop = 0;    $('body').css({'overflow-x':'hidden','overflow-y':'auto'});    window.android.reCal();}

将方法提升到 window 的全局变量,这个时候再去调用的时候就没有问题了!

JS 的问题比较那解决,因为问题的定位本身就是很困难的!



友情提示:

1   给webview  添加了 js 的回调之后,注意代码的混淆。

2  WebViewJSInterface  
    她的处理方法,不要放在主线程,中会有问题。 建议使用子线程。我很喜欢使用 回调+ Handler 的方式处理!
我的Github:

   Hades Webveiw 整理 code



No comments:

Post a Comment