zoukankan      html  css  js  c++  java
  • java与js交互,相互调用传参

    随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等。下面就来看一下java与js交互的简单demo。
    方式
    
    实现js调用java有四种方式:
    
    1.JavascriptInterface
    
    2.WebViewClient.shouldOverrideUrlLoading()
    
    3.WebChromeClient.onConsoleMessage()
    
    4.WebChromeClient.onJsPrompt()
    
       
    
        JavascriptInterface
        这种方式是Android官方提供的Javascript与Native通信的解决方案。
    
            java中创建接口
    
            public class DemoInteface {
                @android.webkit.JavascriptInterface
                public void fromJs(String toast) {
                    Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
                }
            }
                
    
            将接口添加到WebView中
    
            webView = (WebView) findViewById(R.id.wb);
            WebSettings settings = webView.getSettings();
            settings.setJavaScriptEnabled(true);
            webView.loadUrl("file:///android_asset/test.html");
            webView.addJavascriptInterface(new DemoInteface(), "demo");
                
    
            将接口添加到WebView中
    
            <body>
    
                <a href="javascript:;" class="m-btn" onclick="showToast('js的问候送达')">Toast</a>
    
                <script language="javascript">
    
                    function showToast(toast) {
                        javascript:demo.fromJs(toast);
                    };
    
                </script>
            </body>
              
    
            注意js中的javascript:demo.fromJs(toast); 其中类名(dmeo)要与 webView.addJavascriptInterface(new DemoInteface(), “demo”);中第二个参数一致,方法名要与接口中方法的名称一致
    
            
    
    
        WebViewClient.shouldOverrideUrlLoading()
        这个方法是拦截webview中所有的url跳转,根据url来判断是否拦截,来执行不同的操作
    
        java代码
    
        public class CustomWebViewClient extends WebViewClient {
    
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    if (url.contains("toast")) {
                        Log.e("yue", url);
                        Toast.makeText(MainActivity.this, "拦截成功了", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                    return super.shouldOverrideUrlLoading(view, url);
                }
           }
    
    
    
        webView.setWebViewClient(new CustomWebViewClient());
           
    
        js代码
    
        <a href="https://www.baidu.com/?=toast" class="m-btn">Toast2</a>
            1
    
        
    
    
        WebChromeClient.onConsoleMessage()
        这是Android提供给Javascript调试在Native代码里面打印日志信息的API。
    
        java
    
        public class CustomWebChromeClient extends WebChromeClient {
    
                @Override
                public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                    super.onConsoleMessage(consoleMessage);
                    String msg = consoleMessage.message();//Javascript输入的Log内容
                    Log.d("fromjs",msg);
                    return true;
                }
          }
    
        webView.setWebChromeClient(new CustomWebChromeClient());
           
    
        js代码
    
        <a href="javascript:;" class="m-btn" onclick="log()">log</a>
    
    
        function log(){
            console.log('log info from js');
        }
    
    
        
    
    
        WebChromeClient.onJsPrompt()
        除了WebChromeClient.onJsPrompt(),还有WebChromeClient.onJsAlert()和WebChromeClient.onJsConfirm()。顾名思义,这三个Javascript给Native代码的回调接口的作用分别是提示展示提示信息,展示警告信息和展示确认信息。因为极少会用这几种,所以这里就不多做介绍
    
    实现java调用js:
    
    上面说了js调用java有很多方式,常用也是官方推荐的就是前两种,而java调用js就只有一种方式,WebView.loadUrl(),androi 4.4(api 19)以上出现了WebView.evaluateJavascript()来代替loadUrl。
    
    java代码
    
     button.setOnClickListener(new View.OnClickListener() {
         @Override
          public void onClick(View v) {
              if (android.os.Build.VERSION.SDK_INT >= 19) {
                  webView.evaluateJavascript("javascript:wave()", null);
              } else {
                  webView.loadUrl("javascript:wave('')");
              }
          }
      });
    
    
    js代码
    
     var flag = false;
     function wave() {
         if(!flag){
             flag = true;
             document.getElementById("droid").src="testb.png";
         }else{
             flag = false;
             document.getElementById("droid").src="testa.png";
         }
    
     }
    
    
    
    
    
    
    
    
    以上就是一些简单的js与java的交互。要想实现复杂的交互逻辑,可以使用jsBridge这一第三方框架,吓篇博客讲会介绍这一框架的使用及原理。
    
    代码下载: http://download.csdn.net/detail/qq_27942511/9832172
  • 相关阅读:
    AutoCAD如何添加网络打印机 添加公司打印机
    AutoCAD如何方便截图放到Word文档,改成白底黑字
    AutoCAD如何倒角 倒圆角 倒直角
    [RxJS] Groupby operator
    [VSCode] Custom settings
    [TypeScript] Modifier
    [Javascript] Avoid Accidental Returns of New State by using the void Keyword
    动态创建选项卡
    eclipse运行内存不足解决办法
    使用jquery trigger 触发a标签的click事件取代window.open方法
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/10684768.html
Copyright © 2011-2022 走看看