欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之WebView组件的使用解析

程序员文章站 2023-12-15 11:45:52
在 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。

上一篇:

下一篇: