js 与 android 的交互(方法互调用) 和android向 js传递值, js向android传参数 事件拦截看上一篇

mail_detail_v2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>mail</title>
    <style>
        * {
            box-sizing: border-box;
        }
        html {
            font-size: 14px;
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        }
        body,ul,h1,h2,h3,h4,h5,h6 {
            margin: 0;
        }
        hr {
            border: none;
            border-bottom: 1px #d4d4d4 solid;
        }
        .mail-header {
            padding: 0.5rem 1.5rem;
            font-size: 1rem;
            font-weight: 600;
            color: #adadad;
            line-height: 1.5rem;
        }
        .mail-header h2 {
            font-size: 1.14rem;
            letter-spacing: 0.1rem;
            color: #222;
            padding: 0.3rem 0 0.5rem;
        }
        ul {
            list-style: none;
            padding: 0;
        }
        ul.mail-info>li.item {
            font-size: 0;
            padding: 0.2rem 0;
        }
        li.item>.item-title,li.item>.item-content {
            display: inline-block;
            vertical-align: top;
        }
        .item-title {
            font-size: 1rem;
            width: 4.2rem;
        }
        .item-content {
            position: relative;
            font-size: 1rem;
            width: calc(100% - 4.2rem);
        }
        .mail-content {
            padding: 0.5rem 1.5rem;
        }
        .mail-content>p {
            margin: 0;
            text-indent: 2rem;
            line-height: 2rem;
            font-weight: 600;
        }
        .mail-content>p:first-child {
            text-indent: 0;
        }
        .sender,.receiver {
            display: inline-block;
            padding: 0 0.3rem;
            margin-right: 0.2rem;
            margin-bottom: 0.5rem;
            border-radius: 0.2rem;
        }
        .sender.active,.receiver.active {
            text-decoration: none;
            color: white;
            background-color: #0089df;
        }
        .time {
            margin-bottom: 0.5rem;
        }
        .pull-right {
            position: absolute;
            right: 0;
            top: 0;
        }
        a.btn-link {
            color: #0089df;
        }
        .show {
            position: relative;
            display: block;
        }
        .hidden {
            display: none ;
        }
        .padding  {
            padding-right: 2.0rem;
        }
        .attachments {
            width: 100%;
        }
        .attachments>li{
            position: relative;
            padding: 0.5rem 0.8rem;
            font-size: 1rem;
            background-color: #eee;
            border-bottom: 1px #c4c4c4 solid;
        }
        .icon {
            position: absolute;
            display: inline-block;
            width: 1.5rem;
            padding: 0.3rem;
            font-size: 0.8rem;
            line-height: 1.22rem;
            border-radius: 0.2rem;
            background-color: #01b700;
            color: white;
        }
        .attachment {
            min-height: 2rem;
            margin-left: 2rem;
            margin-right: 3rem;
            font-size: 0.8rem;
            font-weight: normal;
            color: #222;
        }
        .attachment-options {
            position: absolute;
            top: 1.1rem;
            right: 1rem;
            display: inline-block;
            height: 2rem;
            width: 1.4rem;
            text-align: center;
            line-height: 0.7rem;
        }
    </style>
</head>
<body>
<article>
    <section class="mail-header">
        <div>
            <h2 id="mail-title"></h2>
            <i class="star-five"></i>
        </div>
        <ul class="mail-info">
            <li class="item">
                <span class="item-title">发件人:</span>
                <div class="item-content" id="sender">

                </div>
            </li>
            <li class="item">
                <span class="item-title">时间:</span>
                <div class="item-content time"><span id="time"></span></div>
            </li>
            <li class="item">
                <span class="item-title">收件人:</span>
                <div class="item-content">
                    <div id="receivers1"></div>
                    <a class="btn-link pull-right" οnclick="openPanel(this, 1)">展开</a>
                    <div class="hidden padding" id="receivers2"></div>
                </div>
            </li>
            <li class="item">
                <span class="item-title">抄送人:</span>
                <div class="item-content">
                    <div id="ccers1"></div>
                    <div class="hidden padding" id="ccers2"></div>
                </div>
            </li>
            <li class="item">
                <span class="item-title">附件:</span>
                <div class="item-content">
                    <span class="padding" id="attachments-len"></span>
                    <a class="btn-link" οnclick="openPanel(this,2)">展开</a>
                </div>
                <div id="attachments" class="hidden">
                    <ul class="attachments" id="attachments-area"></ul>
                </div>
            </li>
        </ul>
    </section>
    <hr>
    <section class="mail-content" id="mail-content"></section>
</article>
<script>
    var $ = function(sign) {
        switch (sign.substr(0, 1)) {
            case '#':
                return document.getElementById(sign.substr(1));
            case '.':
                return document.getElementsByClassName(sign.substr(1));
            default :
                return document.getElementsByTagName(sign.toUpperCase());
        }
    };
    function findNext(el) {
        while ((el = el.nextSibling)){
            if(el.nodeType === 1){
                return el;
            }
        }
    }
    function findPrev(el) {
        while ((el = el.previousSibling)){
            if(el.nodeType === 1){
                return el;
            }
        }
    }
    /*展开*/
    function openPanel(el, type) {
        el.innerHTML = '收起';
        if (type == 1) {
            findPrev(el).style.display = 'none';
            $('#ccers1').style.display = 'none';
            findNext(el).style.display = 'block';
            $('#ccers2').style.display = 'block';
            el.setAttribute('onclick', 'closePanel(this, 1)');
        } else {
            $('#attachments').style.display = 'block';
            el.setAttribute('onclick', 'closePanel(this, 2)');
        }
    }

    /* 收起方法 */
    function closePanel(el, type) {
        el.innerHTML = '展开';
        if (type == 1) {
            findNext(el).style.display = 'none';
            $('#ccers2').style.display = 'none';
            findPrev(el).style.display = 'block';
            $('#ccers1').style.display = 'block';
            el.setAttribute('onclick', 'openPanel(this, 1)');
        } else {
            $('#attachments').style.display = 'none';
            el.setAttribute('onclick', 'openPanel(this, 2)');
        }

    }
    /* 此处为在浏览器测试使用,正式使用时请注释掉此部分*/
    window.onload = function() {
        showData(data);
    }; 

    /* 文档加载完毕之后,调用此方法进行数据填充,通过这个方法将数据 */
    function showData(data) {
    console.log(data)
        console.log("Hellods安抚 world!0")
        if (typeof data != 'object') {
        console.log("Hello world! 阿道夫 1")
            data = JSON.parse(data);
        }
        if (data.MailTitle) {
            $('#mail-title').innerHTML = data.MailTitle;
        }
        if (data.MailPostPeople) {
           $('#sender').innerHTML = '<a class="sender active" οnclick="gotoWriteMail(\'MailPostPeople\',0)">'+data.MailPostPeople+'</a>';
        }
        if (data.MailPostDate) {
            $('#time').innerHTML = data.MailPostDate;
        }
        if (data.MailReceivedPeople.length > 0) {
            var receivers = data.MailReceivedPeople;
            for (var i = 0, len = receivers.length; i < len; i++) {
                var text = receivers[i];
                var options = [
                    {
                        name: 'onclick',
                        value: 'gotoWriteMail(\'MailReceivedPeople\','+ i +')'
                    },
                    {
                        name: 'class',
                        value: 'receiver active'
                    }
                ];
                var receiver = createEl('a',text, options );
                if (i < 3) {
                    $('#receivers1').appendChild(createEl('a',text, options));
                }
                $('#receivers2').appendChild(receiver);
            }
        }
        if (data.MailCCPeople.length > 0) {
            var ccers = data.MailCCPeople;
            for (var i = 0, len = ccers.length; i < len; i++) {
                var text = ccers[i];
                var options = [
                    {
                        name: 'onclick',
                        value: 'gotoWriteMail(\'MailCCPeople\','+ i +')'
                    },
                    {
                        name: 'class',
                        value: 'receiver active'
                    }
                ];
                var ccer = createEl('a', text, options);
                if (i < 3) {
                    $('#ccers1').appendChild(createEl('a', text, options));
                }
                $('#ccers2').appendChild(ccer);
            }
        }
        if (data.MailAttachments.length > 0) {
            var attachments = data.MailAttachments;
            $('#attachments-len').innerHTML=attachments.length+'个';
            for (var i = 0, len = attachments.length; i < len; i++) {
                var item = attachments[i];
                var attachment ='<li><span class="icon">附件</span>' +
                        '<div class="attachment">' +
                        '<span class="attachment-name">'+item.Title+'</span>' +
                        '<br><span class="attachment-size">'+item.Size+'</span>' +
                        '</div>' +
                        '<a class="attachment-options" οnclick="gotoWriteMail(\'MailAttachments\','+ i +')">•<br>•<br>•</a> </li>';
                $('#attachments-area').innerHTML += attachment;

            }
        }
        if (data.MailContent) {
            $('#mail-content').innerHTML = data.MailContent;
        }

    }
	/*type:key,  index: 下标*/
    function gotoWriteMail(type, index) {
        console.log(type + ":" + index)
        window.jsObj.htmlToJava(type,index);
    }

    function createEl(tag, text, attrs) {
        var el = document.createElement(tag);
        el.innerHTML = text;
        for (var i = 0, len = attrs.length; i < len; i++) {
            el.setAttribute(attrs[i].name, attrs[i].value);
        }
        return el;
    }

  /**/var data = window.jsObj.HtmlcallJava();
  /*  var data = {
        MailTitle: '关于2016中秋放假通知',
        MailPostPeople: '小明',
        MailPostDate: '2016年09月07日 15:00 星期三',
        MailReceivedPeople: ['吴婷', '金蔷薇', '腾月', '吴婷', '金蔷薇', '腾月','吴婷', '金蔷薇', '腾月'],
        MailCCPeople: ['吴婷', '金蔷薇', '腾月', '吴婷', '金蔷薇', '腾月','吴婷', '金蔷薇', '腾月'],
        MailAttachments: [{
            Title: 'xxxxxxx.doc',
            Size: '16.23KB'
        }],
        MailContent: '<p>大家好:</p><p>根据《国务院办公厅关于2016年部分节假日安排的通知》和《全国xxxxxxxxxx放假方法》,2016年“中秋节”放假安排如下:</p><p>放假时间自2016年9月15日至2016年9月17日,放假3天,9月18日正常上班。</p>'
    };
    data = JSON.stringify(data);*/
</script>
</body>
</html>



TestActivity.java

package com.homer.jsandroid;

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

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnKeyListener;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class TestActivity extends Activity {

	private Activity mActivity=null;
	private WebView mWebView=null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mActivity=this;
		
		showWebView();
		
	}

	/**WebView与JS交互代码*/
	@SuppressLint("SetJavaScriptEnabled")
	private void showWebView() {
		mWebView=new WebView(this);
		setContentView(mWebView);
		
		mWebView.requestFocus();//请求获得焦点
		
		setOnWebClick(mWebView);
		
		WebSettings webSettings=mWebView.getSettings();
		webSettings.setJavaScriptEnabled(true);
		webSettings.setBuiltInZoomControls(true);
		
		webSettings.setBuiltInZoomControls(true); // 原网页基础上缩放 //0
		webSettings.setSupportZoom(true);// 支持缩放 //0
		webSettings.setDisplayZoomControls(false);// 不显示webview缩放按钮1
//		setting.setDefaultZoom(ZoomDensity.FAR);
		webSettings.setUseWideViewPort(true); 关键点  
		mWebView.setInitialScale(57);//适应全屏: 39适应竖屏 57适应横屏;0默认的,不做任何修改 ;
		mWebView.setScrollContainer(true);//是否允许内容滑动X-Y
		
		webSettings.setDefaultTextEncodingName("utf-8");
		
		mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");//对象的大小写一定要注意
		
		mWebView.loadUrl("file:///android_asset/"+getResources().getString(R.string.mail_detail_v2));
	}
	
	private void setOnWebClick(WebView webView) {
		webView.setWebChromeClient(new WebChromeClient(){

			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				mActivity.setTitle("Loading...");
				mActivity.setProgress(newProgress);
				if (newProgress>=100) {
					mActivity.setTitle("js与WebView 交互");
				}
			}
			
		});
		webView.setWebViewClient(new WebViewClient(){
			/** 
			 * 这个方法是,加载url( 你选中的URL ),就是你的点击事件,<br>
			 * 返回值表示拦不拦截这次点击事件。<br>
			 * 使用view.stopLoading(); 停止加载这个方法。
			 */
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				Toast.makeText(mActivity, url, Toast.LENGTH_SHORT).show();
				Log.e("webView zhong的View", url);
				
				return super.shouldOverrideUrlLoading(view, url);//返回值表示拦不拦截这次点击事件。
			}
			
			
		});
		
		webView.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (keyCode==KeyEvent.KEYCODE_BACK&&mWebView.canGoBack()) {
					mWebView.goBack();
					return true;
				}
				return false;
			}
		});
		
	}

	private Object getHtmlObject(){
		Object object=null;
		object=new Object(){
			/**  java向html中传递值===html调用java中的方法。@JavascriptInterface  4.2版本sdk17以后 要在每个方法上面加上这个注释
			 * <br>不然 这个方法window.jsObj.HtmlcallJava(); 找不到 对应的方法名字
			 **/
			@JavascriptInterface
			public String HtmlcallJava() {
				JSONObject mailJsonObject=new JSONObject();
				
				try {
					mailJsonObject.put("MailTitle", "关于2016中秋放假通知");
					mailJsonObject.put("MailPostPeople", "小名");
					mailJsonObject.put("MailPostDate", "2016年09月07日 15:00 星期三");
					
					JSONArray receive=new JSONArray();
					receive.put("吴婷")
							.put("蔷薇")
							.put("腾月")
							.put("吴婷")
							.put("蔷薇")
							.put("腾月");
					mailJsonObject.put("MailReceivedPeople", receive);
					
					JSONArray cc=new JSONArray();
					cc.put("花花").put("吴婷")
						.put("蔷薇")
						.put("腾月")
						.put("吴婷")
						.put("蔷薇")
						.put("腾月");
					mailJsonObject.put("MailCCPeople", cc);
					
					JSONArray attachArr=new JSONArray();
					JSONObject attach0=new JSONObject();
					attach0.put("Title", "xxxxxxx.doc")
						  .put("Size", "12.36KB");
					JSONObject attach1=new JSONObject();
					attach1.put("Title", "7898498.xls")
							.put("Size", "63.21KB");
					JSONObject attach2=new JSONObject();
					attach2.put("Title", "撒的发放阿斯蒂芬.xls")
							.put("Size", "521.125KB");
					attachArr.put(attach0)
							.put(attach1)
							.put(attach2);
					mailJsonObject.put("MailAttachments", attachArr);
					
					String content="<p>大家好:</p><p>根据《国务院办公厅关于2016年部分节假日安排的通知》和《全国xxxxxxxxxx放假方法》,2016年“中秋节”放假安排如下:</p><br><br><br><p>放假时间自2016年9月15日至2016年9月17日,放假3天,9月18日正常上班。</p>";
					mailJsonObject.put("MailContent", content);
					
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				System.out.println(mailJsonObject.toString());
				return mailJsonObject.toString();//发过去了这个好实用
//				return mailJsonObject;
			}

			/**@JavascriptInterface  4.2版本sdk17以后 要在每个方法上面加上这个注释 
			 * <br>不然 这个方法window.jsObj.HtmlcallJava2(...); 找不到 对应的方法名字
			 * */
			@JavascriptInterface
			public String HtmlcallJava2(final String param){
				return "阿斯顿发士大夫撒即可对方阿斯蒂芬";
			}
			
			/** htm向java中传递参数。@JavascriptInterface  4.2版本sdk17以后 要在每个方法上面加上这个注释
			 * <br>不然 这个方法window.jsObj.htmlToJava(...); 找不到 对应的方法名字
			 * 
			 * 详情看 mail_detail_v2.html  里面的 
			  	function gotoWriteMail(type, index) {
	        		console.log(type + ":" + index)
	        		window.jsObj.htmlToJava(type,index);
	    		}
    			这个方法,有详细说明
			 * */
			@JavascriptInterface
			public void htmlToJava(final String type,final String index){
				Toast.makeText(mActivity, type+"=="+index, Toast.LENGTH_SHORT).show();
				Log.e("webView zhong的View",  type+"=="+index);
				
			}
			
			/** java 调用html 中的方法。@JavascriptInterface  4.2版本sdk17以后 要在每个方法上面加上这个注释
			 * <br>不然 这个方法window.jsObj.JavacallHtml2(); 找不到 对应的方法名字
			 * */
			@JavascriptInterface
			public void JavacallHtml2() {
				runOnUiThread(new  Runnable() {
					public void run() {
						mWebView.loadUrl("javascript:showFromHtml2('爱上对方就爱上的ssssssssssss咖啡阿斯蒂芬按时')");
					
						Toast.makeText(mActivity, "电机  btn  2", Toast.LENGTH_SHORT).show();
					}
				});
			}
			
		};
		
		
		
		return object;
	}
	
	
	
}



生成JSONObject  (我传递的是 toString,传递这个object  不能解析不知道怎么回事)

 var data = {
        MailTitle: '关于2016中秋放假通知',
        MailPostPeople: '小明',
        MailPostDate: '2016年09月07日 15:00 星期三',
        MailReceivedPeople: ['吴婷', '金蔷薇', '腾月', '吴婷', '金蔷薇', '腾月','吴婷', '金蔷薇', '腾月'],
        MailCCPeople: ['吴婷', '金蔷薇', '腾月', '吴婷', '金蔷薇', '腾月','吴婷', '金蔷薇', '腾月'],
        MailAttachments: [{
            Title: 'xxxxxxx.doc',
            Size: '16.23KB'
        }],
        MailContent: '<p>大家好:</p><p>根据《国务院办公厅关于2016年部分节假日安排的通知》和《全国xxxxxxxxxx放假方法》,2016年“中秋节”放假安排如下:</p><p>放假时间自2016年9月15日至2016年9月17日,放假3天,9月18日正常上班。</p>'
    };

JSONObject mailJsonObject=new JSONObject();
				
				try {
					mailJsonObject.put("MailTitle", "关于2016中秋放假通知");
					mailJsonObject.put("MailPostPeople", "小名");
					mailJsonObject.put("MailPostDate", "2016年09月07日 15:00 星期三");
					
					JSONArray receive=new JSONArray();
					receive.put("吴婷")
							.put("蔷薇")
							.put("腾月")
							.put("吴婷")
							.put("蔷薇")
							.put("腾月");
					mailJsonObject.put("MailReceivedPeople", receive);
					
					JSONArray cc=new JSONArray();
					cc.put("花花").put("吴婷")
						.put("蔷薇")
						.put("腾月")
						.put("吴婷")
						.put("蔷薇")
						.put("腾月");
					mailJsonObject.put("MailCCPeople", cc);
					
					JSONArray attachArr=new JSONArray();
					JSONObject attach0=new JSONObject();
					attach0.put("Title", "xxxxxxx.doc")
						  .put("Size", "12.36KB");
					JSONObject attach1=new JSONObject();
					attach1.put("Title", "7898498.xls")
							.put("Size", "63.21KB");
					JSONObject attach2=new JSONObject();
					attach2.put("Title", "撒的发放阿斯蒂芬.xls")
							.put("Size", "521.125KB");
					attachArr.put(attach0)
							.put(attach1)
							.put(attach2);
					mailJsonObject.put("MailAttachments", attachArr);
					
					String content="<p>大家好:</p><p>根据《国务院办公厅关于2016年部分节假日安排的通知》和《全国xxxxxxxxxx放假方法》,2016年“中秋节”放假安排如下:</p><br><br><br><p>放假时间自2016年9月15日至2016年9月17日,放假3天,9月18日正常上班。</p>";
					mailJsonObject.put("MailContent", content);
					
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				System.out.println(mailJsonObject.toString());




注意要领:上图




上篇文章在:webView   分类 里面  自定义MerchantWebView.java中









  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值