1. 程式人生 > >js 與 android 的互動(方法互呼叫) 和android向 js傳遞值, js向android傳引數 事件攔截看上一篇

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" onclick="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" onclick="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" onclick="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" onclick="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中