据说WebView的强大之处就是能和JavaScript进行交互调用。

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

java调用JavaScript

  1. 实例化webview,获得WebSettings。通过WebSettings设置可以和JavaScript交互。

            myWebView = (WebView) findViewById(R.id.webview);
    WebSettings webSettings = myWebView.getSettings();
    // 使能使用JavaScript
    webSettings.setJavaScriptEnabled(true);
  2. 设置webview的 WebViewClient,重写onPageFinished方法。设置当网页加载完后去调用网页中JavaScript。
            myWebView.setWebViewClient(new WebViewClient() {
    
                @Override
    public void onPageFinished(WebView view, String url) {
    //当page也加载完后
    super.onPageFinished(view, url);
    javaUseJavaScript(myWebView);
    } });
    myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
  3. 实现第二步里自定义的javaUseJavaScript方法。
        /**
    * java调用js方法
    *
    * @param webView
    */
    private void javaUseJavaScript(WebView webView) {
    String call = "javascript:sayHello()"; // call = "javascript:alertMessage(\"" + "content" + "\")";
    //
    // call = "javascript:toastMessage(\"" + "content" + "\")";
    //
    // call = "javascript:sumToJava(1,2)";
    webView.loadUrl(call);
    }

    完成了上面的步骤,就能调用JavaScript中sayHello()方法。sayHello方法在哪呢??就在你myWebView.loadUrl("file:///android_asset/js_java_interaction.html");的html文件中

    <html>
    <script type="text/javascript">
    function sayHello() {
    alert("Hello")
    } function alertMessage(message) {
    alert(message)
    } function toastMessage(message) {
    window.control.toastMessage(message)
    } function sumToJava(number1, number2){
    window.control.onSumResult(number1 + number2)
    }
    </script>
    Java-Javascript Interaction In Android
    </html>
  4. 总结:的从上面的代码可以看出,java调js的代码中,java可以给js传递参数,但无法获得返回值。如果必须要返回值,只能反过来通过js调用java。也就是我们下面说的:

JavaScript调用Java

  1. 编写JavaScript代码去调用java中的方法。其实在java调用JavaScript的第三步的html中我们已经调用了。(绿色部分)
  2. 在java中编写代码,响应JavaScript的调用。

2.1给webview添加JavaScript接口类

myWebView.addJavascriptInterface(new JsInteration(), "control");

2.2编写JavaScript的接口类  JsInteration

  /**
* 实现js调用java的具体代码
* @author cyq
*
*/
public class JsInteration { @JavascriptInterface
public void toastMessage(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
} @JavascriptInterface
public void onSumResult(int result) {
Log.i(TAG, "onSumResult result=" + result);
}
}
  • 总结:js调用java代码就是window.在addJavascriptInterface设置的第二个字符参数.在addJavascriptInterface这第一个参数类里的方法.(参数1,参数2.....).
  • 注意:

1要调用WebView的addJavascriptInterface方法。在JavaScript的接口类中的方法前要加上@JavascriptInterface注解。

2html文件要放到Android项目的assets文件夹下:

3 调用JavaScript要在加载完网页之后,就是WebViewClient的onPageFinished方法中。

4 WebView的方法必须在主线程之中,至于为何就不知道了。原本我担心加载网页放在主线程中会导致ANR,其实不用担心这个问题,WebView内部应该做了处理了。

代码在WebViewActivity中。

4.4处理

前面说到java调用JavaScript只能传参数,无法得到返回值。如果需要返回值需要反过来JavaScript调用java代码,通过参数传递获得返回值。这在4.4以后有了改进。可以通过下面说的调用JavaScript的方法获得返回值。不过我个人认为还是用传递参数的方法比较好吧。版本兼容嘛。

  1. 在WebViewClient的onPageFinished方法中调用JavaScript

            myWebView.setWebViewClient(new WebViewClient() {
    
                @Override
    public void onPageFinished(WebView view, String url) {
    //当page也加载完后
    super.onPageFinished(view, url);
    testEvaluateJavascript( myWebView);
    } });
  2. 实现java代码
    /**
    * 调用JavaScript方法获得返回值
    * @param myWebView2
    */
    @SuppressLint("NewApi")
    protected void testEvaluateJavascript(WebView myWebView2) {
    myWebView.evaluateJavascript("getReturn(\""+"参数1"+"\")", new ValueCallback<String>() { @Override
    public void onReceiveValue(String value) {
    Log.i(TAG, "onReceiveValue value=" + value);
    }
    });
    }
  3. 在html中编写JavaScript代码(绿色部分)
    <html>
    <script type="text/javascript">
    function sayHello() {
    alert("Hello")
    } function alertMessage(message) {
    alert(message)
    } function toastMessage(message) {
    window.control.toastMessage(message)
    } function sumToJava(number1, number2){
    window.control.onSumResult(number1 + number2)
    }
    function getReturn(message) {
    return 1;
    }
    </script>
    Java-Javascript Interaction In Android
    </html>

    运行代码,在Android的log中能够看到返回值1.

webview与JavaScript之间的交互的更多相关文章

  1. 在android中实现webview与javascript之间的交互(转)

    参见“在android中实现webview与javascript之间的交互”

  2. 一处疑难杂症的术后总结:WebView和JavaScript之间的交互

    近期在公司里參与了M3项目的开发,这个项目是使用HTML5开发的前端页面,在开发完成后,把项目地址写入Android.iOS的壳源代码里面,这样当应用被打开时候自己主动加载项目首页的URL.这样的做法 ...

  3. WebView之javascript与android交互基础加强

    一.什么是js与android交互? 通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码. 二.为什么要使用js与java代码交互? 1.可以做一些js网页做本身处理不了的事情 ...

  4. Android中webview跟JAVASCRIPT中的交互

    在android的应用程序中,可以直接调用webview中的javascript代码,而webview中的javascript代码,也可以去调用ANDROID应用程序(也就是JAVA部分的代码).下面 ...

  5. Android中webview和js之间的交互(转)

    http://www.cnblogs.com/leizhenzi/archive/2011/06/29/2093636.html 1.android中利用webview调用网页上的js代码. Andr ...

  6. Android WebView与JavaScript交互操作(Demo)

    应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...

  7. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  8. Android中WebView的JavaScript代码和本地代码交互的三种方式

    一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...

  9. Android总结之WebView与Javascript交互[转]

    Android总结之WebView与Javascript交互   前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.We ...

随机推荐

  1. BLOB存储图片文件二进制数据是非对错

    子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先 ...

  2. 首次登录与在线求助man page

    为了避免瞬间断电造成的Linux系统损害,建议作为服务器的Linux主机应该加上不断电系统来持续提供稳定的电力. 在终端环境中,可依据提示符为$或#判断为一般几号或root账号. 要取得终端支持的语言 ...

  3. check cable connection PXE-M0F: Exiting intel PXE ROM no bootable device-- insert boot disk and pre

    今天修电脑遇到一个问题,新买的电脑的原装的是linux,然后我按常规方式进入PE后重装系统,然后开机一直显示下面的代码,进不去: check cable connection PXE-M0F: Exi ...

  4. Android(一)

    Android Activity TextView,Button 1.在fragment_main.xml文件中直接添加控件 2.在MainActivity.java文件中添加TextView控件 在 ...

  5. 图片占位 css

    手机端图片高度和宽度不能自动比例缩小的问题 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  6. satellite-menu和ArcMenu

    github上的开源库其实还是很不错的,之前的时候总感觉学一些开源库比较麻烦,里边有好多方法什么的,今天终于迈出了第一步,中间也遇到了一些问题,现在总结下,也给其他刚开始学习开源库的小伙伴一些指导: ...

  7. Ext 随笔

    /-------------------------//清空panel等后面空白属性//------------------------- baseCls:"x-plain" // ...

  8. 安装rvm命令行工具

    rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. https://rvm.io/ 如果你打算学习ruby/rails, rvm是必不可少的工具之一. 这里所有的命令都是再用户 ...

  9. new关键字和newInstance()方法的区别

    转载:http://blog.csdn.net/iloveyin/article/details/7965183 1.类的加载方式不同    在执行Class.forName("a.clas ...

  10. light 1012 Guilty Prince

    题意:一共有 T 组测试数据,每组先给两个数,w,h,表示给一个 高h,宽w的矩阵,‘#’表示不能走,‘.’表示能走,‘@’表示起始点,问,从起始点出发能访问多少个点. 简单的BFS题,以前做过一次. ...