Android中Java和JS双向调用

来源:互联网 发布:淘宝不能用 编辑:程序博客网 时间:2024/05/01 13:41

         找到满意的不错公司了,接下来就是自己的奋斗了。这两天弄一个WebView中JS的双向调用,大概猜得到其中的步骤方法,但是还是会有一些混乱和盲点。搜了几篇文章,看看代码,修修改改,先上代码,晚点后面再做总结。


(1)、MainActivity.java

package com.example.administrator.androidjstest;import android.app.Activity;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.os.Handler;import android.webkit.WebViewClient;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {    private WebView webView;    public Handler handler=new Handler();    public Button textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView=(Button)findViewById(R.id.textview);        webView=(WebView)findViewById(R.id.webview);        webView.getSettings().setJavaScriptEnabled(true);        webView.setWebChromeClient(new WebChromeClient() {        });        webView.getSettings().setDefaultTextEncodingName("UTF-8");        webView.addJavascriptInterface(new MyObject(this, handler), "myObject");        webView.loadUrl("file:///android_asset/index.html");        webView.setWebViewClient(new WebViewClient() {            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);                String call = "javascript:sumToJava(1,2)";                webView.loadUrl(call);            }        });        textView.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v) {                handler.post(new Runnable() {                    @Override                    public void run() {                        webView.loadUrl("javascript:showMsg()");                    }                });            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}

(2)、MyObject.java

package com.example.administrator.androidjstest;import android.app.Activity;import android.content.Context;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.webkit.JavascriptInterface;import android.webkit.WebView;import org.json.JSONArray;import org.json.JSONObject;import android.os.Handler;import android.widget.Toast;/** * Created by Administrator on 2015/7/21. */public class MyObject {    private MainActivity ma;    private WebView webView;    private Handler handler;    MyObject(MainActivity activity,Handler handler){        ma=activity;        this.webView=(WebView)activity.findViewById(R.id.webview);        this.handler=handler;    }    @JavascriptInterface    public void showMessage(String msg) {        Toast.makeText(ma, msg, Toast.LENGTH_SHORT).show();    }    //Java回调js返回的数据    @JavascriptInterface    public void onSumResult(int result) {        Log.i("HJP", "onSumResult result=" + result);    }    @JavascriptInterface    public void init(){        //通过handler来确保init方法的执行在主线程中        handler.post(new Runnable() {            public void run() {                //调用客户端setContactInfo方法                webView.loadUrl("javascript:setContactInfo('" + getJsonStr() + "')");            }        });    }    public static String getJsonStr(){        try{            JSONObject object=new JSONObject();            object.put("id",0);            object.put("name","lzx");            object.put("phone","sbsbsb");            JSONObject object1=new JSONObject();            object1.put("id",1);            object1.put("name","hjp");            object1.put("phone","nvshennvshen");            JSONArray jsonArray=new JSONArray();            jsonArray.put(object);            jsonArray.put(object1);            return jsonArray.toString();        }catch (Exception e){            e.printStackTrace();        }        return  null;    }}



(3)、index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"        "http://www.w3.org/TR/html4/loose.dtd"><html><head>    <meta name="viewport" content="width=device-width, target-densitydpi=device-dpi" />    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">    <title></title>    <script type="text/javascript">    function sumToJava(number1, number2){       window.myObject.onSumResult(number1 + number2)       window.myObject.showMessage('Hope');       }    function showMsg(){      alert("liuzhixinshidasha");   }   function showMsgInAndroid(){      window.myObject.showMessage('hello in android!');   }        <!--//data数据类型为字符串,字符串里面是数组,每一个数组元素为一个json对象,例如"[{id:1,name:'张三',phone:'135656461'},{id:2,name:'李四',phone:'1896561'}]"-->        function setContactInfo(data)        {            var tableObj = document.getElementById("contact");            var jsonObjects = eval(data);   //通过eval方法处理得到json对象数组            for(var i=0; i<jsonObjects.length; i++)            {                   var jsonObj = jsonObjects[i];    //获取json对象                   var tr = tableObj.insertRow(tableObj.rows.length);   //添加一行                   //添加三列                   var td1 = tr.insertCell(0);                   var td2 = tr.insertCell(1);                   var td3 = tr.insertCell(2);                   td1.innerHTML = jsonObj.id;                   td2.innerHTML = jsonObj.name;                   td3.innerHTML = jsonObj.phone;            }        }    </script></head><!--onload="javascript:myObject.init()调用服务器端init方法--><body onload="javascript:myObject.init()"><button id='btntest' onclick='showMsgInAndroid()'>调用android方法</button><table id="contact">    <tr>        <td>编号</td>        <td>姓名</td>        <td>电话</td>    </tr></table></body></html>

(4)、activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">    <WebView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/webview"        android:layout_above="@+id/textview">    </WebView>    <Button        android:layout_width="match_parent"        android:layout_height="60dp"        android:text="hohohahi"        android:gravity="center"        android:layout_alignParentBottom="true"        android:layout_centerHorizontal="true"        android:id="@+id/textview"/></RelativeLayout>

效果图:



一运行出现:



点击“调用android方法”按钮,出现:



点击“hohohahi”按钮出现:


参考文章:
http://liaokang-java.iteye.com/blog/1168832

http://blog.csdn.net/ljz2009y/article/details/39926039

0 0
原创粉丝点击