Android开发之WebView组件的使用解析
程序员文章站
2023-12-05 17:15:58
在 android 手机中内置了一款高性能 webkit 内核浏览器, sdk 中封装为一个叫做 webview 组件。 webview 类是 webkit 模块 java...
在 android 手机中内置了一款高性能 webkit 内核浏览器, sdk 中封装为一个叫做 webview 组件。
webview 类是 webkit 模块 java 层的视图类,( 所有需要使用 web 浏览功能的android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,webkit 模块支持 http、https、ftp 以及 javascript 请求。
webview 作为应用程序的 ui 接口,为用户提供了一系 列的网页浏览、用户交互接口,客户程序通过这些接口访问 webkit 核心代码。 )
什么是 webkit
webkit 是 mac os x v10.3 及以上版本所包含的软件框架(对 v10.2.7 及以上版本也可通过 软件更新获取) 同时,
webkit 也是 mac os x 的 safari 网页浏览器的基础。webkit 是一个开源项目,主要由 kde 的 khtml 修改而来并且包含了一些来自苹果公司的一些组件。
传统上, webkit 包含一个网页引擎 webcore 和一个脚本引擎 javascriptcore,它们分别对应 的是 kde 的 khtml 和 kjs。
不过,随着 javascript 引擎的独立性越来越强,现在 webkit 和 webcore 已经基本上混用不分(例如 google chrome 和 maxthon 3 采用 v8引擎,却仍然 宣称自己是 webkit 内核) 。
这里我们初步体验一下在 android 是使用 webview 浏览网页,
sdk 的 dev guide 中有一个 在 webview 的简单例子 。 在开发过程中应该注意几点: 1.androidmanifest.xml 中必须使用许可"android.permission.internet",否则会出 web page not available 错误。
2.如果访问的页面中有 javascript,则 webview 必须设置支持 javascript。 webview.getsettings().setjavascriptenabled(true);
3.如果页面中链接, 如果希望点击链接继续在当前 browser 中响应, 而不是新开 android 的系统browser 中响应该链接,必须覆盖 webview 的 webviewclient 对象。
mwebview.setwebviewclient(new webviewclient(){ public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } });
mwebview.setwebviewclient(new webviewclient(){ public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } });
4.如果不做任何处理,浏览网页,点击系统“back”键,整个 browser 会调用 finish()而结束自身,
如果希望浏览的网 页回退而不是推出浏览器,需要在当前 activity 中处理并消费 掉该 back 事件。
public boolean onkeydown(int keycode, keyevent event){ <br> if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) {
mwebview.goback();
return true;
}
return super.onkeydown(keycode, event);
}
在tomcat上放一个漂亮页面
1.加载网页(加权限)
定义一个网址输入文本框,点按钮用webview打开这个网页
2.编写data字符串,webview.loaddata(data,"text/html","utf-8");
3.用dialog的setiem打开网址,前进,后退,放大,缩小,清历史。
4.用html定义开发界面。file:/android_asset/a.html
<script>
function loadurl(){ }
< /script>
< select name="">
<option value=""/>
<option value=""/>
< /select>
webview.getsettings().setjavascriptenabled(true);
webview.getsettings().setbuiltinzoomcontrols(true);
webview.loadurl(file:///...);
5.js对话框(用chom..)
function openalert(){
window.alert("");
}
function openconfirm(){
if(window.confirm("是否删除此信息?")){
window.location="myjs.html";//-------------------!!!
}
}
<input type="submit" value="警告" onclick="openalert()">
< input type="submit" value="确认" onclick="openconfirm()">
java调js中的方法:
//在java中调用javascript方法要通过loadurl()来进行,把要调用的方法作为loadurl方法的字符串参数
settings.setjavascriptenabled(true);//设置在webview中可用js
webview.loadurl("javascript:myprompt1()");
javascript中调java中的方法:(特别强调要用android2.2版模拟器)
webview.addjavascriptinterface(new myinterface(), "myobj");//第二步---注册在js中调用的对象名myobj
webview.loadurl("file:///android_asset/test.html");
//第一步:定义要在js中调用的方法
class myinterface{
public string getname(){
return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
}
------------javascript中:-----
function myinterface(){
document.getelementbyid("myname").innerhtml = window.myobj.getname() ;
}
webview控件功能强大,除了具有一般view的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
webview有几个可以定制的点:
(1)设置webchromeclient子类,webchromeclient会在一些影响浏览器ui交互动作发生时被调用,比如webview关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webview获得焦点等等,详见webchromeclient
(2)设置webviewclient子类,webviewclient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见webviewclient
(3)设置websettings类,其中包含多项配置。websettings用来对webview的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见websettings
(4)设置addjavascriptinterface方法,将java对象绑定到webview中,以方便从页面js中控制java对象, 实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webview的代码都是自己完成,详细使用addjavascriptinterface进行自动化见本文5使用addjavascriptinterface完成和js交互
1、back键控制网页后退
activity默认的back键处理为结束当前activity,webview查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onkeydown函数,告诉他如何处理,如下:
public boolean onkeydown(int keycode, keyevent event) {
if (webview.cangoback() && event.getkeycode() == keyevent.keycode_back && event.getrepeatcount() == 0) {
webview.goback();
return true;
}
return super.onkeydown(keycode, event);
}
其中webview.cangoback()在webview含有一个可后退的浏览记录时返回true
webview.goback();表示返回webview的上次访问页面
webview(网络视图)能加载显示网页,可以将其视为一个浏览器。
网络内容:
1、loadurl直接显示网页内容(单独显示网络图片)
2、loaddata显示中文网页内容(含空格的处理)
apk包内文件:
1、loadurl显示apk中html和图片文件
2、loaddata(loaddatawithbaseurl)显示apk中图片和文字混合的html内容res/layout/main.xml
----------------------------------------------------------
当运行提示为web page not available时去清单文件中添加权限
<uses-permission android:name="android.permission.internet"/>
urlutil.isnetworkurl(string uri)方法用来判断用户输入的url是否有效,如无效则会显示一个toast信息框来提醒用户输入正确的url
----------------------------------------------------------
步骤:
1、在布局文件中声明webview
2、在activity中实例化webview
3、调用webview的loadurl( )方法,设置wevview要显示的网页
4、为了让webview能够响应超链接功能,调用setwebviewclient( )方法,设置 webview视图
5、用webview点链接看了很多页以后为了让webview支持回退功能,需要覆盖覆盖activity类的onkeydown()方法,如果不做任何处理,点击系统回退键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
6、需要在androidmanifest.xml文件中添加权限,否则出现web page not available错误。
<uses-permission android:name="android.permission.internet"/>
下面是具体的例子:
mainactivity.java
package com.android.webview.activity;
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 webview;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
webview = (webview) findviewbyid(r.id.webview);
//设置webview属性,能够执行javascript脚本
webview.getsettings().setjavascriptenabled(true);
//加载需要显示的网页
webview.loadurl("http://www.8way.com/");
//设置web视图
webview.setwebviewclient(new hellowebviewclient ());
}
@override
//设置回退
//覆盖activity类的onkeydown(int keycoder,keyevent event)方法
public boolean onkeydown(int keycode, keyevent event) {
if ((keycode == keyevent.keycode_back) && webview.cangoback()) {
webview.goback(); //goback()表示返回webview的上一页面
return true;
}
return false;
}
//web视图
private class hellowebviewclient extends webviewclient {
@override
public boolean shouldoverrideurlloading(webview view, string url) {
view.loadurl(url);
return true;
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<webview
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</linearlayout>
在androidmanifest.xml文件中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.webview.activity"
android:versioncode="1"
android:versionname="1.0">
<uses-sdk android:minsdkversion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".mainactivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.internet"/>
</manifest>
webview学习记录总结:
首先要在 manifest.main 文件中创建一个 webview,
然后再 activity 中定义这个 webview 然后 进行以下相关操作。
1、添加权限:androidmanifest.xml 中必须使用许可"android.permission.internet",否则会出 web page not available 错误。
2、在要activity 中生成一个 webview 组件:webview webview = new webview(this);
3、设置webview 基本信息:
如果访问的页面中有 javascript,则 webview 必须设置支持 javascript。
webview.getsettings().setjavascriptenabled(true);
触摸焦点起作用 requestfocus(); 取消滚动条 this.setscrollbarstyle(scrollbars_outside_overlay);
4 如果希望点击链接由自己处理,而不是新开 android 的系统 browser 中响应该链接。
给 webview添加一个事件监听对象( webviewclient)并重写其中的一些方法:
shouldoverrideurlloading:对网页中超链接按钮的响应。当按下某个连接时 webviewclient会调用这个方法,
并传递参数:按下的 url onloadresource onpagestart onpagefinish onreceiveerror onreceivedhttpauthrequest
5、如果访问的页面中有 javascript,则 webview 必须设置支持 javascript ,否则显示空白页面。
java 代码 webview.getsettings().setjavascriptenabled(true);
6、如果页面中链接,如果希望点击链接继续在当前 browser 中响应,而不是新开 android 的系统 browser 中响应该链接,必须覆盖 webview 的 webviewclient 对象: java 代码 1.mwebview.setwebviewclient(new webviewclient(){ 2. 3. 4. 5. 6. });
上述方法告诉系统由我这个 webviewclient 处理这个 intent,我来加载 url。 点击一个链接的 intent 是向上冒泡的,
shouldoverrideurlloading 方法 return true 表示我加载后这个 intent 就消费了, 不再向上冒泡了。
7、 如果不做任何处理, 在显示你的 brower ui 时, 点击系统“back”键, 整个 browser 会作为一个整体“back" }
public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true;
到其他 activity 中,而不是希望的在 browser 的历史页面中 back。
webview 类是 webkit 模块 java 层的视图类,( 所有需要使用 web 浏览功能的android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,webkit 模块支持 http、https、ftp 以及 javascript 请求。
webview 作为应用程序的 ui 接口,为用户提供了一系 列的网页浏览、用户交互接口,客户程序通过这些接口访问 webkit 核心代码。 )
什么是 webkit
webkit 是 mac os x v10.3 及以上版本所包含的软件框架(对 v10.2.7 及以上版本也可通过 软件更新获取) 同时,
webkit 也是 mac os x 的 safari 网页浏览器的基础。webkit 是一个开源项目,主要由 kde 的 khtml 修改而来并且包含了一些来自苹果公司的一些组件。
传统上, webkit 包含一个网页引擎 webcore 和一个脚本引擎 javascriptcore,它们分别对应 的是 kde 的 khtml 和 kjs。
不过,随着 javascript 引擎的独立性越来越强,现在 webkit 和 webcore 已经基本上混用不分(例如 google chrome 和 maxthon 3 采用 v8引擎,却仍然 宣称自己是 webkit 内核) 。
这里我们初步体验一下在 android 是使用 webview 浏览网页,
sdk 的 dev guide 中有一个 在 webview 的简单例子 。 在开发过程中应该注意几点: 1.androidmanifest.xml 中必须使用许可"android.permission.internet",否则会出 web page not available 错误。
2.如果访问的页面中有 javascript,则 webview 必须设置支持 javascript。 webview.getsettings().setjavascriptenabled(true);
3.如果页面中链接, 如果希望点击链接继续在当前 browser 中响应, 而不是新开 android 的系统browser 中响应该链接,必须覆盖 webview 的 webviewclient 对象。
mwebview.setwebviewclient(new webviewclient(){ public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } });
mwebview.setwebviewclient(new webviewclient(){ public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } });
4.如果不做任何处理,浏览网页,点击系统“back”键,整个 browser 会调用 finish()而结束自身,
如果希望浏览的网 页回退而不是推出浏览器,需要在当前 activity 中处理并消费 掉该 back 事件。
复制代码 代码如下:
public boolean onkeydown(int keycode, keyevent event){ <br> if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) {
mwebview.goback();
return true;
}
return super.onkeydown(keycode, event);
}
在tomcat上放一个漂亮页面
1.加载网页(加权限)
定义一个网址输入文本框,点按钮用webview打开这个网页
2.编写data字符串,webview.loaddata(data,"text/html","utf-8");
3.用dialog的setiem打开网址,前进,后退,放大,缩小,清历史。
4.用html定义开发界面。file:/android_asset/a.html
复制代码 代码如下:
<script>
function loadurl(){ }
< /script>
< select name="">
<option value=""/>
<option value=""/>
< /select>
webview.getsettings().setjavascriptenabled(true);
webview.getsettings().setbuiltinzoomcontrols(true);
webview.loadurl(file:///...);
5.js对话框(用chom..)
复制代码 代码如下:
function openalert(){
window.alert("");
}
function openconfirm(){
if(window.confirm("是否删除此信息?")){
window.location="myjs.html";//-------------------!!!
}
}
<input type="submit" value="警告" onclick="openalert()">
< input type="submit" value="确认" onclick="openconfirm()">
java调js中的方法:
复制代码 代码如下:
//在java中调用javascript方法要通过loadurl()来进行,把要调用的方法作为loadurl方法的字符串参数
settings.setjavascriptenabled(true);//设置在webview中可用js
webview.loadurl("javascript:myprompt1()");
javascript中调java中的方法:(特别强调要用android2.2版模拟器)
复制代码 代码如下:
webview.addjavascriptinterface(new myinterface(), "myobj");//第二步---注册在js中调用的对象名myobj
webview.loadurl("file:///android_asset/test.html");
//第一步:定义要在js中调用的方法
class myinterface{
public string getname(){
return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
}
------------javascript中:-----
复制代码 代码如下:
function myinterface(){
document.getelementbyid("myname").innerhtml = window.myobj.getname() ;
}
webview控件功能强大,除了具有一般view的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
webview有几个可以定制的点:
(1)设置webchromeclient子类,webchromeclient会在一些影响浏览器ui交互动作发生时被调用,比如webview关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webview获得焦点等等,详见webchromeclient
(2)设置webviewclient子类,webviewclient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见webviewclient
(3)设置websettings类,其中包含多项配置。websettings用来对webview的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见websettings
(4)设置addjavascriptinterface方法,将java对象绑定到webview中,以方便从页面js中控制java对象, 实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webview的代码都是自己完成,详细使用addjavascriptinterface进行自动化见本文5使用addjavascriptinterface完成和js交互
1、back键控制网页后退
activity默认的back键处理为结束当前activity,webview查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onkeydown函数,告诉他如何处理,如下:
复制代码 代码如下:
public boolean onkeydown(int keycode, keyevent event) {
if (webview.cangoback() && event.getkeycode() == keyevent.keycode_back && event.getrepeatcount() == 0) {
webview.goback();
return true;
}
return super.onkeydown(keycode, event);
}
其中webview.cangoback()在webview含有一个可后退的浏览记录时返回true
webview.goback();表示返回webview的上次访问页面
webview(网络视图)能加载显示网页,可以将其视为一个浏览器。
网络内容:
1、loadurl直接显示网页内容(单独显示网络图片)
2、loaddata显示中文网页内容(含空格的处理)
apk包内文件:
1、loadurl显示apk中html和图片文件
2、loaddata(loaddatawithbaseurl)显示apk中图片和文字混合的html内容res/layout/main.xml
----------------------------------------------------------
当运行提示为web page not available时去清单文件中添加权限
<uses-permission android:name="android.permission.internet"/>
urlutil.isnetworkurl(string uri)方法用来判断用户输入的url是否有效,如无效则会显示一个toast信息框来提醒用户输入正确的url
----------------------------------------------------------
步骤:
1、在布局文件中声明webview
2、在activity中实例化webview
3、调用webview的loadurl( )方法,设置wevview要显示的网页
4、为了让webview能够响应超链接功能,调用setwebviewclient( )方法,设置 webview视图
5、用webview点链接看了很多页以后为了让webview支持回退功能,需要覆盖覆盖activity类的onkeydown()方法,如果不做任何处理,点击系统回退键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
6、需要在androidmanifest.xml文件中添加权限,否则出现web page not available错误。
<uses-permission android:name="android.permission.internet"/>
下面是具体的例子:
mainactivity.java
复制代码 代码如下:
package com.android.webview.activity;
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 webview;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
webview = (webview) findviewbyid(r.id.webview);
//设置webview属性,能够执行javascript脚本
webview.getsettings().setjavascriptenabled(true);
//加载需要显示的网页
webview.loadurl("http://www.8way.com/");
//设置web视图
webview.setwebviewclient(new hellowebviewclient ());
}
@override
//设置回退
//覆盖activity类的onkeydown(int keycoder,keyevent event)方法
public boolean onkeydown(int keycode, keyevent event) {
if ((keycode == keyevent.keycode_back) && webview.cangoback()) {
webview.goback(); //goback()表示返回webview的上一页面
return true;
}
return false;
}
//web视图
private class hellowebviewclient extends webviewclient {
@override
public boolean shouldoverrideurlloading(webview view, string url) {
view.loadurl(url);
return true;
}
}
}
main.xml
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<webview
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</linearlayout>
在androidmanifest.xml文件中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.webview.activity"
android:versioncode="1"
android:versionname="1.0">
<uses-sdk android:minsdkversion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".mainactivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.internet"/>
</manifest>
webview学习记录总结:
首先要在 manifest.main 文件中创建一个 webview,
然后再 activity 中定义这个 webview 然后 进行以下相关操作。
1、添加权限:androidmanifest.xml 中必须使用许可"android.permission.internet",否则会出 web page not available 错误。
2、在要activity 中生成一个 webview 组件:webview webview = new webview(this);
3、设置webview 基本信息:
如果访问的页面中有 javascript,则 webview 必须设置支持 javascript。
webview.getsettings().setjavascriptenabled(true);
触摸焦点起作用 requestfocus(); 取消滚动条 this.setscrollbarstyle(scrollbars_outside_overlay);
4 如果希望点击链接由自己处理,而不是新开 android 的系统 browser 中响应该链接。
给 webview添加一个事件监听对象( webviewclient)并重写其中的一些方法:
shouldoverrideurlloading:对网页中超链接按钮的响应。当按下某个连接时 webviewclient会调用这个方法,
并传递参数:按下的 url onloadresource onpagestart onpagefinish onreceiveerror onreceivedhttpauthrequest
5、如果访问的页面中有 javascript,则 webview 必须设置支持 javascript ,否则显示空白页面。
java 代码 webview.getsettings().setjavascriptenabled(true);
6、如果页面中链接,如果希望点击链接继续在当前 browser 中响应,而不是新开 android 的系统 browser 中响应该链接,必须覆盖 webview 的 webviewclient 对象: java 代码 1.mwebview.setwebviewclient(new webviewclient(){ 2. 3. 4. 5. 6. });
上述方法告诉系统由我这个 webviewclient 处理这个 intent,我来加载 url。 点击一个链接的 intent 是向上冒泡的,
shouldoverrideurlloading 方法 return true 表示我加载后这个 intent 就消费了, 不再向上冒泡了。
7、 如果不做任何处理, 在显示你的 brower ui 时, 点击系统“back”键, 整个 browser 会作为一个整体“back" }
public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true;
到其他 activity 中,而不是希望的在 browser 的历史页面中 back。
推荐阅读