您的位置:首页 > 移动开发 > Android开发

Android中Java和JS双向调用

2015-07-22 14:51 525 查看
         找到满意的不错公司了,接下来就是自己的奋斗了。这两天弄一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript webview