最近有个项目需要开发一个简单的apk,两年没碰android了,突然要用还真不能适应,基本上都忘了。。
加载sd卡中的html
1. loadUrl
直接可以加载html文件,没发现什么问题
webview.loadUrl("file:///mnt/sdcard/webview_demo/jsurvey/test.html" );
2. loadData
首先特殊字符要转化
private String changeEscape(String data) {
if(data != null){
// #, %, , ?
//转换成 %23, %25, %27, %3f
data = data.replaceAll("#", "%23");
data = data.replaceAll("%", "%25");
data = data.replaceAll("\\", "%27"); //正则转义\, 每个在java中也要转义一下,所以就变成了\\
data = data.replaceAll("\?", "%3f"); //正则转义?, 在java中要转义一下,于是\?
}
return data;
}
如果引用的文件不使用绝对路径的话,会显示空白
使用绝对路径的话,会报错
目前没找到有引用文件时一定要使用loadData的解决办法。
还是退一步,使用loadDataWithBaseUrl吧。
3. loadDataWithBaseUrl
如果有引用的js文件和css文件,引用的文件要使用绝对路径
<script src="file:///mnt/sdcard/webview_demo/jsurvey/js/jquery-1.7.1.js"></script>
<link rel="stylesheet" href="file:///mnt/sdcard/webview_demo/jsurvey/css/survey.css?v=3">
html 页面及与 js 间的相互调用
android 学习笔记之加载 html 页面及与 js 间的相互调用 main 中: <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/webView" />
Activity 中: public class HtmlUIActivity extends Activity { private WebView webview; public Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webview = (WebView)this.findViewById(R.id.webView); webview.getSettings().setJavaScriptEnabled(true); //开启 javascript 支持 webview.getSettings().setSupportZoom(false); webview.getSettings().setAppCacheEnabled(false); webview.getSettings().setAllowFileAccess(true); // java 把数据传给 js // js 中可以利用“myjs”来调用 show 方法,myjs 就相当于一个 MyJavaScript 对象 // 可以调用 MyJavaScript 中的方法 webview.addJavascriptInterface(new MyJavaScript(this, handler), "myjs"); String url = "file:///android_asset/index.html"; // assets 下的路径 webview.loadUrl(url); }
与 js 通信的类: public class MyJavaScript { private Context context; private WebView webview; private Handler handler;
public MyJavaScript(Context context, Handler handler) { this.context = context; this.handler = handler; webview = (WebView)((Activity)context).findViewById(R.id.webView); } // 在 java 中调用 js 中的 contactlist()方法,并传参数 public void show() { handler.post(new Runnable() { @Override public void run() { webview.loadUrl("javascript:contactlist('" + query() + "')"); }
}); } // 打电话(要加拨打权限) public void call(final String phone) { handler.post(new Runnable() { @Override public void run() { context.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone))); } }); }
public String query() { try { JSONObject jsonObject = new JSONObject(); jsonObject.put("id", 56); jsonObject.put("name", "胡一刀"); jsonObject.put("phone", "151--323"); JSONObject jsonObject2 = new JSONObject(); jsonObject2.put("id", 96); jsonObject2.put("name", "胡勇"); jsonObject2.put("phone", "151--326"); JSONArray jsonArray = new JSONArray(); jsonArray.put(jsonObject); jsonArray.put(jsonObject2); return jsonArray.toString(); } catch (JSONException e) { } return ""; } }