Android 和html的互相调用

  之前的时候做过Android和Html之间的调用,时间已久就有点遗忘了,现在回头看一下,顺便做一下记录。
  Android调用网页的形式主要是采用控件WebView来实现的。
1.首先要布局上一个WebView控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <WebView
        android:id="@+id/act_html_webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>

2.在Activiry中获取此控件,并且设置这个控件的属性

    @SuppressLint("SetJavaScriptEnabled")
    private void initView() {
        // 加载页面
        webView = (WebView) findViewById(R.id.act_html_webview);

        WebSettings ws = webView.getSettings();
        ws.setJavaScriptEnabled(true);
        ws.setSupportZoom(true);
        ws.setBuiltInZoomControls(true);
        ws.setUseWideViewPort(true);// 设置此属性,可任意比例缩放。

        // 自适应屏幕
        ws.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
        ws.setLoadWithOverviewMode(true);

        String htmlFile = "file:///android_asset/" + table.htmlName;
        webView.loadUrl(htmlFile);
        // 在js中调用本地java方法
        webView.addJavascriptInterface(new JsInterface(this), "AndroidWebView");

        // 添加客户端支持
        webView.setWebChromeClient(new WebChromeClient());
    }

3.编写中间类 JsInterface

private class JsInterface {
        private Context mContext;

        public JsInterface(Context context) {
            this.mContext = context;
        }

        // 在js中调用window.AndroidWebView.getHtmlValue(name),便会触发此方法。
        @JavascriptInterface
        // 这个声明很重要 如果target 大于等于API 17,则需要加上如下注解
        public String getHtmlValue(String value) {
            Toast.makeText(mContext, value, Toast.LENGTH_SHORT).show();
            return value;
        }

        @JavascriptInterface
        public String getAllValues(String value) {
            htmlValue = saveToDB(value);// 得到网页中填写的数据
            Intent intent = new Intent();
            intent.putExtra("TABLE_NAME", table.tableName);
            setResult(102, intent);
            finish();
            return value;
        }
    }

4.编写Html文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="zh-cn" />

        <title>Android WebView 与 Javascript 交互</title>
        <head>
          <style>
          body {background-color:#e6e6e6}

          .rect
          {
            color:white;
            font-family:Verdana, Arial, Helvetica, sans-serif;
            font-size:16px;
            width:100px;
            padding:6px;
            background-color:#98bf21;
            text-decoration:none;
            text-align:center;
            border:none;
            cursor:pointer;
          }

          .inputStyle {font-size:18px;padding:6px;;
            border-bottom: 1px solid black;
            margin: 0px;
            padding: 0px;
            background:url(0) no-repeat;
            border-top :none;
            border-left :none;
            border-right :none;
           }
           .textareaStyle {font-size:18px;padding:6px;;
            border-bottom: 1px solid black;
            margin: 0px;
            padding: 0px;
            background:url(0) no-repeat;
            border-top :none;
            border-left :none;
            border-right :none;
            resize :none;
            overflow-x :hidden;
            overflow-y :hidden
           }
           .labelStyle{
            line-height:50px;
            font-size:20px;
            font-family:楷体_GB2312;
          }
          #textarea { 
                display: block;
                margin:0 auto;
                overflow: hidden; 
                width: 550px; 
                font-size: 14px;
                height: 18px; 
                line-height: 24px;
                padding:2px; 
            }
            textarea {
                outline: 0 none;
                border-color: rgba(82, 168, 236, 0.8);

            }
          </style>
        </head>

        <body>
          <p align="center" style='font-size:30px'>作 业 笔 录</p>
            <div class="form-group">  
                 <label class="sr-only" for="account" >时间:</label>   
                 <textarea id="id_Inquir1_1" class="textareaStyle" rows=1 cols= 4 onclick="javascript:autoTextarea(this);" ></textarea>
                 <label class="sr-only" for="account" ></label>
                 <textarea id="id_Inquir1_2" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea>  
                 <label class="sr-only" for="account" ></label>
                 <textarea id="id_Inquir1_3" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea>      
                 <label class="sr-only" for="account" ></label>
                 <textarea id="id_Inquir1_4" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" ></label>
                 <textarea id="id_Inquir1_5" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" >分至</label>
                 <textarea id="id_Inquir1_6" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" ></label>
                 <textarea id="id_Inquir1_7" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" >分结束</label>
          </div>  
          <div class="form-group">  
            <label class="sr-only" for="account" >地点:</label>  
                <textarea id="id_Inquir1_8" class="textareaStyle" rows=1 cols= 80 onclick="javascript:autoTextarea(this);" ></textarea> 
            </div>
            <div class="form-group">  
            <label class="sr-only" for="account" >人物:</label>  
                <textarea id="id_Inquir1_9" class="textareaStyle" rows=1 cols= 80 onclick="javascript:autoTextarea(this);" ></textarea> 
            </div>
            <div class="form-group">  
            <label class="sr-only" for="account" >记录人:</label>  
                <textarea id="id_Inquir1_10" class="textareaStyle" rows=1 cols= 80 onclick="javascript:autoTextarea(this);" ></textarea> 
            </div>
            <div class="form-group">  
                 <label class="sr-only" for="account" >被询问人姓名:</label>
                 <textarea id="id_Inquir1_11" class="textareaStyle" rows=1 cols= 10 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;性别:</label>
                 <textarea id="id_Inquir1_12" class="textareaStyle" rows=1 cols= 2 onclick="javascript:autoTextarea(this);" ></textarea>    
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;年龄:</label>
                 <textarea id="id_Inquir1_13" class="textareaStyle" rows=1 cols= 3 onclick="javascript:autoTextarea(this);" ></textarea> 
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;民族:</label>
                 <textarea id="id_Inquir1_14" class="textareaStyle" rows=1 cols= 20 onclick="javascript:autoTextarea(this);" ></textarea> 
          </div>  
          <div class="form-group">  
                 <label class="sr-only" for="account" >文化程度:</label> 
                 <textarea id="id_Inquir1_15" class="textareaStyle" rows=1 cols= 10 onclick="javascript:autoTextarea(this);" ></textarea>   
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;职业:</label>
                 <textarea id="id_Inquir1_16" class="textareaStyle" rows=1 cols= 30 onclick="javascript:autoTextarea(this);" ></textarea>   
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;工作单位:</label>
                 <textarea id="id_Inquir1_17" class="textareaStyle" rows=1 cols= 30 onclick="javascript:autoTextarea(this);" ></textarea>   
          </div> 
          <div class="form-group">  
                 <label class="sr-only" for="account" >住址:</label>  
                 <textarea id="id_Inquir1_18" class="textareaStyle" rows=1 cols= 40 onclick="javascript:autoTextarea(this);" ></textarea>   
                 <label class="sr-only" for="account" >&nbsp;&nbsp;&nbsp;&nbsp;联系电话:</label>
                 <textarea id="id_Inquir1_19" class="textareaStyle" rows=1 cols= 20 onclick="javascript:autoTextarea(this);" ></textarea>    
          </div>                                      
          <script>


                /**
                 * 文本框根据输入内容自适应高度
                 * @param                {HTMLElement}        输入框元素
                 * @param                {Number}                设置光标与输入框保持的距离(默认0)
                 * @param                {Number}                设置最大高度(可选)
                 */
                var autoTextarea = function (elem, extra, maxHeight) {
                        extra = extra || 0;
                        var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
                        isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
                                addEvent = function (type, callback) {
                                        elem.addEventListener ?
                                                elem.addEventListener(type, callback, false) :
                                                elem.attachEvent('on' + type, callback);
                                },
                                getStyle = elem.currentStyle ? function (name) {
                                        var val = elem.currentStyle[name];

                                        if (name === 'height' && val.search(/px/i) !== 1) {
                                                var rect = elem.getBoundingClientRect();
                                                return rect.bottom - rect.top -
                                                        parseFloat(getStyle('paddingTop')) -
                                                        parseFloat(getStyle('paddingBottom')) + 'px';        
                                        };

                                        return val;
                                } : function (name) {
                                                return getComputedStyle(elem, null)[name];
                                },
                                minHeight = parseFloat(getStyle('height'));


                        elem.style.resize = 'none';

                        var change = function () {
                                var scrollTop, height,
                                        padding = 0,
                                        style = elem.style;

                                if (elem._length === elem.value.length) return;
                                elem._length = elem.value.length;

                                if (!isFirefox && !isOpera) {
                                        padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
                                };
                                scrollTop = document.body.scrollTop || document.documentElement.scrollTop;

                                elem.style.height = minHeight + 'px';
                                if (elem.scrollHeight > minHeight) {
                                        if (maxHeight && elem.scrollHeight > maxHeight) {
                                                height = maxHeight - padding;
                                                style.overflowY = 'auto';
                                        } else {
                                                height = elem.scrollHeight - padding;
                                                style.overflowY = 'hidden';
                                        };
                                        style.height = height + extra + 'px';
                                        scrollTop += parseInt(style.height) - elem.currHeight;
                                        document.body.scrollTop = scrollTop;
                                        document.documentElement.scrollTop = scrollTop;
                                        elem.currHeight = parseInt(style.height);
                                };
                        };

                        addEvent('propertychange', change);
                        addEvent('input', change);
                        addEvent('focus', change);
                        change();
                };

              function sendInfoToJava(){
                //调用android程序中的方法,并传递参数
                var name = document.getElementById("name_input1").value;
                window.AndroidWebView.showInfoFromJs(name);
              }

              //在android代码中调用此方法
              function showInfoFromJava(msg){
                alert("来自网页的信息:"+msg);
              }

              function getHtmlValue(){
                var name = document.getElementById("name_input3").value;
                window.AndroidWebView.getHtmlValue(name);
              }
              function getValues(){
                     //获取ID为cargetdate下面的input为text的ID和value,如果是页面所有的input则将document.getElementById("cargetdate")换为document即可
                     //var list=document.getElementById("cargetdate").getElementsByTagName("input");
                     var list=document.getElementsByTagName("textarea");
                     var strData="";
                      //对表单中所有的input进行遍历
                     for(var i=0;i<list.length && list[i];i++) {
                           //判断是否为文本框
                           //if(list[i].type=="text"&&list[i].id!="subEmail") {
                                    strData +=list[i].id+":"+list[i].value+";";        
                           //}
                     }
                     window.AndroidWebView.getAllValues(strData);
                }
                function setValues(){
                     var result = window.AndroidWebView.getValuesFromDB();
                     var obj = eval("("+result+")");//解析json字符串

                     var list=document.getElementsByTagName("textarea");
                     for(var i=0;i<list.length && list[i];i++) {
                          var user=obj[i];
                            list[i].value = user.value;
                            //list[i].value = "123";
                     }
                }

          </script>
        </body>
</html>

总结:以上就是Android和JS互相调用的过程。其中代码中的注释已经注释的很明白了,是在原来的代码的基础之上略加修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值