研究JS的目的,项目开发过程中由于需要绘制中国地图及其个个省份,地图的绘制工作也算是很简单,但是由于Android上对这快的绘制并不支持,所以这里调研了下关于JS这块的绘制处理,JQuery这块支持绘制SVG绘制方式,当然Android也是支持SVG绘制,这里由于兼容问题,SVG的支持Android的支持版本最低是5.0,故而这个思路不可循。这里Android对能和JS交互就想到了WebView,这也是这篇博客研究的由来。
先前对这块仅仅是坐着了解的态度,现在也算是现学现用吧。
咱们直接看代码,现看XML文件,界面布局,WebView + Button
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.jquerymap.MainActivity" > <WebView android:id="@+id/webview_map" android:layout_width="match_parent" android:layout_height="200dp" /> <Button android:id="@+id/btnJava2Js" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/webview_map" android:text="java2js" /> </RelativeLayout>
上边说到了WebView,这里咱们简单的写个本地的Html界面,处理相应的java2js已经js2java的逻辑.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<script type="text/javascript">
function javacalljswithargs(arg){
document.getElementById("content").innerHTML +=
("<br>"+arg);
}
</script>
</head>
<body>
this is my html <br/>
<!-- window.android.startFunction()
window:窗体对象
android:是该出传入的字段 mWebViewMap.addJavascriptInterface(this, "android");
startFunction(): 是该出传入的this对象中的方法 mWebViewMap.addJavascriptInterface(this, "android");
-->
<a onClick="window.android.startFunction()">点击调用java代码</a><br/>
<a onClick="window.android.startFunction('hello java')" >点击调用java代码并传递参数</a>
<br/>
<div id="content">内容显示</div>
</body>
</html>
window:窗体对象
android:是该出传入的字段 mWebViewMap.addJavascriptInterface(this, "android");
startFunction(): 是该出传入的this对象中的方法 mWebViewMap.addJavascriptInterface(this, "android");
下面是关于交互界面的代码逻辑MainActivity,这里说明下,@JavascriptInterface注解必须在当前js回调方法下加以标准,否则会报如下错误
02-14 14:56:13.704: I/chromium(8820): [INFO:CONSOLE(19)] "Uncaught Error: Method not found", source: file:///android_asset/index.html (19)
package com.example.jquerymap; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Toast; @SuppressLint("SetJavaScriptEnabled") public class MainActivity extends Activity { private WebView mWebViewMap; @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebViewMap = (WebView) this.findViewById(R.id.webview_map); WebSettings webSettings = mWebViewMap.getSettings(); webSettings.setJavaScriptEnabled(true); mWebViewMap.loadUrl("file:///android_asset/index.html"); mWebViewMap.addJavascriptInterface(this, "android"); this.findViewById(R.id.btnJava2Js).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub
//--java调用js 格式:javascript:方法名字(参数) mWebViewMap.loadUrl("javascript:javacalljswithargs("+ "'java2js'" +")"); } }); } @JavascriptInterface public void startFunction() { Toast.makeText(this, "startFunction ", Toast.LENGTH_SHORT).show(); } @JavascriptInterface public void startFunction(String s){ Toast.makeText(this, "startFunction " + s, Toast.LENGTH_SHORT).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }