标签:android 入门 webview javascript html
Android网络编程浅析——WebView浏览器编程初涉
——转载请注明出处:coder-pig
本节引言:
不知不觉Android网络编程浅析也快接近尾声了,在这part中我们学习了很多关于android
在网络方面的编程,现在我们来回顾一下吧!
part 1:xml文件的简单了解:以及android中解析xml文件的一些常用方式:sax,dom,pull解析xml
part 2:Android访问网络资源:HTML协议,获取图片,获取网页代码,解析服务器返回的xml数据,
解析服务器返回的JSON数据
part 3:Android网络数据的下载:J2SE单线程下载文件,J2SE普通多线程下载文件
Android多线程断点下载
part 4:Android网络数据的上传:GET或POST方式上传数据;开源框架HttpClient上传数据;
发送xml数据给服务;通过Http协议上传文件;WebService平台的了解以及简单应用
而在Part 5中为大家讲解的是Android中提供的一个组件:WebView(网络视图)的讲解,相比起前面
的内容来说,就容易很多了,那么,就跟随笔者的脚步来学习WebView的使用吧!
笔者要上课,上完回去发哈
正文:
详细代码如下:
package com.jay.example.webviewdemo1; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { private WebView wView; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wView = new WebView(this); //①实例化WebView对象 wView.setWebViewClient(new WebViewClient() //②设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中 { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); wView.getSettings().setJavaScriptEnabled(true); //③设置WebView属性,运行执行js脚本 wView.loadUrl("http://www.baidu.com/"); //④调用loadView方法为WebView加入链接 setContentView(wView); //⑤调用Activity提供的setContentView将webView显示出来 } //⑥另外还需要重写回退按钮的方法,不然,当我们在WebView中点击多个页面后,一按回退就退出程序了的 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && wView.canGoBack()) { wView.goBack(); //goBack()表示返回WebView的上一页面 return true; } return false; } }
这个其实和在Activity中直接设置的差别不大,代码都差不多;
另外在第一个代码中并没有深入的对回退按钮的点击事件只是
设置了webView的回退,相信细心的读者已经发现,这个程序无论你怎么
按都是退出不了程序的,哈哈!所以在demo2中给出处理方案;
当webView不能再回退,再设置点击两次后退出app,详情见代码
布局代码:activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jay.example.webviewdemo2.MainActivity" > <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editurl" android:hint="请输入要访问的Url" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnload" android:text="浏览" /> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webview" /> </LinearLayout>
MainActivity.java
package com.jay.example.webviewdemo2; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText editurl; private Button btnload; private WebView webView; private String strurl; //定义一个用来存储点击退出按钮时间的便利 private long exitTime = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editurl = (EditText) findViewById(R.id.editurl); btnload = (Button) findViewById(R.id.btnload); webView = (WebView) findViewById(R.id.webview); //设置WebView属性,能够执行Javascript脚本 webView.getSettings().setJavaScriptEnabled(true); //设置Web视图 webView.setWebViewClient(new MyWebViewClient()); btnload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { strurl = editurl.getText().toString(); //如果用户输入的url不带有http://是找不到网页的哦! if(!strurl.startsWith("http://")) { strurl = "http://" + strurl; } webView.loadUrl(strurl); } }); } //当我们在webView上打开多个网页后,我们会习惯性地按回退键 //这个时候我们需要重写回退键按钮,当点击后调用的是WebView的goBack方法 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if(System.currentTimeMillis() - exitTime > 2000) { if(webView.canGoBack()) { webView.goBack(); } else { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } } else { System.exit(0); } } return false; } //Web视图,继承WebViewClient,重写shouldOverrideUrlLoading方法 //这样做的话可以避免我们点击了WebView中某个链接,继续在该WebView窗口上打开网页 //而不是开启手机自身的broswer来打开链接 class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } }
getSettings() |
返回一个WebSettings对象,用来控制WebView的属性设置 |
loadUrl(String url) |
加载指定的Url |
loadData(String data,String mimeType,String encoding) |
加载指定的Data到WebView中.使用"data:"作为标记头,
改方法不能加载网络数据.其中mimeType为数据类型如:textml,image/jpeg. encoding为字符的编码方式 |
setWebViewClient(WebViewClient client) |
为WebView指定一个WebViewClient对象.WebViewClient可 以辅助WebView处理各种通知,请求等事件。 |
setWebChromeClient(WebChromeClient client) |
为WebView指定一个WebChromeClient对象,WebChromeClient专门用来辅助WebView处理js的对话框,网站title,网站图标,加载进度条等 |
setJavaScriptEnabled(boolean flag) |
设置是否支持JavaScript |
setDefaultFontSize(int size) |
设置默认的字体大小 |
setDefaultTextEncodingName(String
encoding) |
设置默认字符的编码方式
|
setAllowFileAccess(boolean allow): |
设置是否允许访问文件数据 |
setDatabaseEnabled(boolean flag) |
设置是否可以使用数据库相关的api |
setDatabasePath(String databasePath) | 若使用数据库API,该方法指定数据库文件的路径 |
setBlockNetworkImage(boolean flag) | 设置是否禁止显示图片,true表示禁止图片 |
setSavePassword(boolean save) | 设置是否保存密码 |
setTextize(WebSetting.TextSize) | 设置页面文字大小 |
setSupportZoom(bollean support) | 设置是否支持变焦 |
onPageStared(WebView view,String url) | 通知主程序网页开始加载 |
onPageFinished(WebView view,String url,Bitmap favicon) |
通知主程序,网页加载完毕 |
doUpdateVisitedHistory(WebView view,String url,boolean isReload) |
更新历史记录 |
onLoadResource(WebView view,String url) |
通知主程序WebView即将加载指定url的资源 |
onScaleChanged(WebView view,float oldScale,float newScale) |
ViewView的缩放发生改变时调用 |
shouldOverrideKeyEvent(WebView view,KeyEvent event) | 控制webView是否处理按键时间,如果返回true 则WebView不处理,返回false则处理 |
shouldOverrideUrlLoading(WebView view,String url) | 控制对新加载的Url的处理,返回true,说明主程序处理 WebView不做处理,返回false意味着WebView会 对其进行处理 |
onReceivedError(WebView view,int errorCode,String description, String failingUrl) |
遇到不可恢复的错误信息时调用 |
onJsAlert(WebView view,String url,String message,JsResult result) | 处理Js中的Alert对话框 |
onJsConfirm(WebView view,String url,String message,JsResult result) |
处理Js中的Confirm对话框 |
onJsPrompt(WebView view,String url,String message String defaultValue,,JsPromptResult result) |
处理Js中的Prompt对话框 |
onProgressChanged(WebView view,int newProgress) |
当加载进度条发生改变时调用 |
在开始讲解这里之前,相信大家都知道webView是一个类似于浏览器的组件了,他就是用来加载网页的;
但是它真的只有加载网页那么简单么?答案肯定是否定的;首先大家都知道HTML是拿来做静态网站的吧
但是Android的界面开发可以采用HTML网页技术,相比起我们用Layout技术慢慢布局显得更加方便,快捷
当然,屏幕适配是需要解决的问题;另外在我们的HTML中需要获取Android设备的相关信息时,比如获取设备
所在的经纬度(定位),或者读取联系人,打电话,发送信息等的!而实现互访的原理如下:
html——js——java,就是说以js为媒介,只需要传递JSon类型的数据即可!
注意:为了节省篇幅.以下代码使用的html文件都是放到assets目录下的,访问时
直接用loadUrl("file:///android_asset/~")即可
代码示例:
效果图:
核心代码:
自定义一个Object对象,js通过该类暴露的方法来调用Android
MyObject.java:
package com.jay.example.webviewdemo3; import android.app.AlertDialog; import android.content.Context; import android.widget.Toast; public class MyObject { Context context; public MyObject(Context context) { this.context = context; } //将显示Toast和对话框的方法暴露给JS脚本调用 public void showToast(String name) { Toast.makeText(context, name, Toast.LENGTH_SHORT).show(); } public void showDialog() { new AlertDialog.Builder(context) .setTitle("联系人列表").setIcon(R.drawable.ic_launcher) .setItems(new String[]{"小王","小坏","小猪","小狗","小猫"}, null) .setPositiveButton("确定", null).create().show(); } }
my.html
<!DOCTYPE html> <html> <head> <title>Js调用Android</title> </head> <body> <input type="button" value="Toast提示" onclick="myObj.showToast('逗比');"/> <input type="button" value="列表对话框" onclick="myObj.showDialog();"/> </body> </html>
对象暴露给Js,js就可以通过该对象操作与Android相关的操作了
package com.jay.example.webviewdemo3; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView; @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webView); webView.loadUrl("file:///android_asset/my.html"); WebSettings webSettings = webView.getSettings(); //①设置WebView允许调用js webSettings.setJavaScriptEnabled(true); webSettings.setDefaultTextEncodingName("UTF-8"); //②将object对象暴露给Js,调用addjavascriptInterface webView.addJavascriptInterface(new MyObject(MainActivity.this), "myObj"); } }ps:上述代码在4.2及以上的虚拟机上都是运行后都是没有点击效果的,
笔者也不知道为什么,但是在真机上都是可以的!
效果图:
核心代码:
创建一个html文件,然后把它放到工程的assets目录下:
my.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv = "Content-Type" content="text/html;charset=UTF-8" <title>测试Js的三种不同对话框</title> <script language="JavaScript"> function alertFun() { alert("Alert警告对话框!"); } function confirmFun() { if(confirm("访问百度?")) {location.href = "http://www.baidu.com";} else alert("取消访问!"); } function promptFun() { var word = prompt("Prompt对话框","请输入点什么...:"); if(word) { alert("你输入了:"+word) }else{alert("呵呵,你什么都没写!");} } </script> </head> <body> <p>三种对话框的使用</p> <p>Alert对话框</p> <p> <input type="submit" name = "Submit1" value="展示1" onclick="alertFun()"/> </p> <p>Confirm对话框</p> <p> <input type="submit" name = "Submit2" value="展示2" onclick="confirmFun()"/> </p> <p>Prompt对话框</p> <p> <input type="submit" name = "Submit3" value="展示3" onclick="promptFun()"/> </p> </body> </html>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jay.example.webviewdemo4.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请输入要访问的Url的地址" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editurl" android:text="file:///android_asset/my.html" /> <Button android:id="@+id/btnload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载网页" /> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webview" /> </LinearLayout>prompt_view.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:selectAllOnFocus="true" android:scrollHorizontally="true" /> </LinearLayout>
三种不同的对话框的方法即可
package com.jay.example.webviewdemo4; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.webkit.JsPromptResult; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; public class MainActivity extends Activity { private EditText editurl; private Button btnload; private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editurl = (EditText) findViewById(R.id.editurl); btnload = (Button) findViewById(R.id.btnload); webView = (WebView) findViewById(R.id.webview); //获得WebSetting对象,支持js脚本,可访问文件,支持缩放,以及编码方式 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAllowFileAccess(true); webSettings.setBuiltInZoomControls(true); webSettings.setDefaultTextEncodingName("UTF-8"); //设置WebChromeClient,处理网页中的各种js事件 webView.setWebChromeClient(new MyWebChromeClient()); btnload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String url = editurl.getText().toString(); webView.loadUrl(url); } }); } //这里需要自定义一个类实现WebChromeClient类,并重写三种不同对话框的处理方法 //分别重写onJsAlert,onJsConfirm,onJsPrompt方法 class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { //创建一个Builder来显示网页中的对话框 new Builder(MainActivity.this).setTitle("Alert对话框").setMessage(message) .setPositiveButton("确定",new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }).setCancelable(false).show(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new Builder(MainActivity.this).setTitle("Confirm对话框").setMessage(message) .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).setCancelable(false).show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { //①获得一个LayoutInflater对象factory,加载指定布局成相应对象 final LayoutInflater inflater = LayoutInflater.from(MainActivity.this); final View myview = inflater.inflate(R.layout.prompt_view, null); //设置TextView对应网页中的提示信息,edit设置来自于网页的默认文字 ((TextView) myview.findViewById(R.id.text)).setText(message); ((EditText) myview.findViewById(R.id.edit)).setText(defaultValue); //定义对话框上的确定按钮 new Builder(MainActivity.this).setTitle("Prompt对话框").setView(myview) .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //单机确定后取得输入的值,传给网页处理 String value = ((EditText)myview.findViewById(R.id.edit)).getText().toString(); result.confirm(value); } }) .setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).show(); return true; } } }
当我们点击某个电话号码时,会直接跳转到拨号页面
效果图:
首先是创建我们的HTML文件,这里可能有部分对JS不熟悉的朋友,笔者也是如此,因为JS的问题,笔者卡了
一晚上都没找到错误!后来才发现自己的Js写错了,这里有兴趣的可以研究下流程,不会的就直接复制可以了
通常HTML都是有人编写的,我们要做的只是WebView上的开发,以及定义用于JS传递数据相关的对象即可!
下述代码的简单原理是:利用onload()在网页加载的时候加载相应的js脚本,而js脚本中定义的一个函数是
取出传递过来的对象,获取里面的数据,通过for循环以单元行的形式打印出来!
my.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>显示获取的联系人列表</title> <script language="JavaScript"> function show(jsondata) { //将传递过来的Json转换为对象 var jsonobjs = eval(jsondata); //获取下面定义的表格 var table = document.getElementById("PersonTable"); //遍历上面创建的Json对象,将每个对象添加为 //表格中的一行,而它的每个属性作为一列 for(var i = 0;i < jsonobjs.length;i++) { //添加一行,三个单元格: var tr = table.insertRow(table.rows.length); var td1 = tr.insertCell(0); var td2 = tr.insertCell(1); td2.align = "center"; var td3 = tr.insertCell(2); //设置单元格的内容和属性 //其中innerHTML为设置或者获取位于对象起始和结束标签内的HTML //jsonobjs[i]为对象数组中的第i个对象 td1.innerHTML = jsonobjs[i].id; td2.innerHTML = jsonobjs[i].name; //为现实的内容添加超链接,超链接会调用Java代码中的 //call方法并且把内容作为参数传递过去 td3.innerHTML = "<a href = 'javascript:sharp.call(\""+jsonobjs[i].phone + "\")'>" +jsonobjs[i].phone + "</a>";; } } </script> </head> <!-- onload指定该页面被加载时调用的方法,这里调用的是Java代码中的contactlist方法--> <body style="margin:0px; background-color:#FFFFFF; color:#000000;" onload = "javascript:sharp.contactlist()"> <!--定义一个表格--> <table border = "0" width = "100%" id = "PersonTable" cellspacing = "0"> <tr> <td width = "15%">用户id</td> <td align = "center">姓名</td> <td width = "15%">号码</td> </tr> </table> </body> </html>
定义一个业务bean类:
contact.java
package com.jay.example.webviewdemo5; public class Contact { private Integer id; private String name; private String phone; public Contact(){} public Contact(Integer id, String name, String phone) { super(); this.id = id; this.name = name; this.phone = phone; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
最后是MainActivity.java文件,这里为了节省篇幅,把获取联系人的方法也定义
在了该类中,实际开发中不要这样做!!!
package com.jay.example.webviewdemo5; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONObject; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView; @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webview); //设置WebView的相关设置,依次是: //支持js,不保存表单,不保存密码,不支持缩放 //同时绑定Java对象 webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setSaveFormData(false); webView.getSettings().setSavePassword(false); webView.getSettings().setSupportZoom(false); webView.getSettings().setDefaultTextEncodingName("UTF-8"); webView.addJavascriptInterface(new SharpJS(), "sharp"); webView.loadUrl("file:///android_asset/my.html"); System.out.println("webView相关参数设置"); } //自定义一个Js的业务类,传递给JS的对象就是这个,调用时直接javascript:sharp.contactlist() public class SharpJS { public void contactlist() { try { System.out.println("contactlist()方法执行了!"); String json = buildJson(getContacts()); webView.loadUrl("javascript:show('"+json+"')"); }catch(Exception e){System.out.println("设置数据失败" + e);} } public void call(String phone) { System.out.println("call()方法执行了!"); Intent it = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+phone)); startActivity(it); } } //将获取到的联系人集合写入到JsonObject对象中,再添加到JsonArray数组中 public String buildJson(List<Contact> contacts)throws Exception { JSONArray array = new JSONArray(); for(Contact contact:contacts) { JSONObject jsonObject = new JSONObject(); jsonObject.put("id", contact.getId()); jsonObject.put("name", contact.getName()); jsonObject.put("phone", contact.getPhone()); array.put(jsonObject); } return array.toString(); } //定义一个获取联系人的方法,返回的是List<Contact>的数据 public List<Contact> getContacts() { System.out.println("getContacts方法执行了"); List<Contact> Contacts = new ArrayList<Contact>(); ContentResolver cr = getApplicationContext().getContentResolver(); Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); while(cursor.moveToNext()){ Contact Contact = new Contact(); //获取联系人id String contatId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Contact.setId(Integer.parseInt(contatId)); //获取联系人姓名 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Contact.setName(name); //因为一个联系人的电话号码可能有几个,但我们这里仅仅是获取一个就够了,所以就不循环遍历了 Cursor phones = getApplicationContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contatId, null, null); phones.moveToFirst(); String num = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Contact.setPhone(num); Contacts.add(Contact); phones.close(); } cursor.close(); for(Contact ct:Contacts) { System.out.println(ct.getId() + "*" + ct.getName() + "*" + ct.getPhone()); } return Contacts; } }
1.对WebViwe进行简单了解,在Activity中调用WebView中的两种方式
2.WebView的相关方法:①WebView②WebSetting③WebViewClient④WebChromeClient
3.Html通过WebView的js调用Android中的方法流程总结:
①webView.getSettings().setJavaScriptEnabled(true); 设置启动JS调用功能
②webView.addJavascriptInterface(new SharpJS(), "sharp"); 将object对象暴露给JS,
③JS可以根据sharp操作SharpJS对象中的参数与方法
另外,上述demo可能需要加入以下权限,自己看情况添加:
<uses-permission android:name="android.permission.INTERNET"/> //联网
<uses-permission android:name="android.permission.CALL_PHONE"/> //打电话
<uses-permission android:name="android.permission.READ_CONTACTS"/> //读取联系人
笔者要上课,回去再上传
1)直接在Activity中使用WebView:
2)在布局中设置静态WebView
3)HTML通过js弹出Toast和列表对话框
4)HTML通过js弹出三种不同对话框:
5)HTML通过WebView的js读取Android联系人并显示:WebViewDemo5.zip
标签:android 入门 webview javascript html
原文地址:http://blog.csdn.net/coder_pig/article/details/39496463