安卓+html+css+js 填坑之路

安卓+html+css+js
其实就是使用webview 作为中间件 完成html 和安卓的附合
webview如何设置等 就不再赘述 分享我在当中遇到的一些问题

1.html 放的位置

安卓+html+css+js 填坑之路
andoridstudio没有给这个文件夹 放在src/main/assets 需要自己创建 assets文件夹

2.如何调用html 以及一些静态资源

        <link href="file:///android_asset/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
        <link href="file:///android_asset/css/main.css" rel="stylesheet" media="screen"/>
        <script src="file:///android_asset/js/jquery.min.js"></script>
        <script src="file:///android_asset/js/bootstrap.min.js"></script>
         webview.loadUrl("file:///android_asset/html/main.html");

3.js 的最基本的 alert 为什么不出现弹窗

  1) activty.java中设置支持js
         webview.getSettings().setJavaScriptEnabled(true);

2)设置js可以打开窗口

 webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webview.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b2 = new AlertDialog.Builder(MainActivity.this)
                        .setTitle("提示").setMessage(message)
                        .setPositiveButton("ok", new AlertDialog.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                result.confirm();
                            }
                        });

                b2.setCancelable(false);
                b2.create();
                b2.show();
                return true;
            }
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsConfirm(view, url, message, result);
            }
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
                                      JsPromptResult result) {
                // TODO Auto-generated method stub
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
        });
    }

4.js如何从后台取数据

先看java部分 通过 addJavascriptInterface 将自定义的类,和自定义的名称形成映射

webview.addJavascriptInterface(new PayJavaScriptInterface(){}, "demo");

实现类 注意使用 @JavascriptInterface 注解

class PayJavaScriptInterface {
    PayJavaScriptInterface() {
    }
    @JavascriptInterface
    public String getUserinfo()  {
        return "getUserinfo";
    }


    @JavascriptInterface
    public boolean needLogin()  {
        return true;
    }
    }

js页面的调用

    <script>
      $(document).ready(function(){
        var tt=window.demo.getUserinfo();
        alert(tt);
       });
    </script>

5. 后端java如何将一个数组传给js

如果想要直接传,肯定是做不到了
java 和 js 之间的数据交换仅限于几种基本类型 比如int String 等等
但是如果我有数组怎么传呢
可以把数组转化成 json 字符串 然后传过去

   import org.json.JSONArray;
   import org.json.JSONException;


    @JavascriptInterface
    public String data()  {
        String []m=new String [30];
        for(int i=0;i<30;i++){
            m[i]="t"+i;
        }
        try{
            JSONArray jsonArray=new JSONArray(m);
               return  jsonArray.toString();
        } catch (JSONException e) {
            e.printStackTrace();
            }
         return null;
      }

然后再用 js 把 json 字符串转成 json 数组

  <script>
     $(document).ready(function(){
        let tt=window.demo.data();
        let data = JSON.parse(tt);
        for(let i=0;i<10;i++){
            alert(data[i]);
        }
    </script>