zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

2023-06-13 09:14:42 时间
在Android手机中内置了一款高性能webkit内核浏览器,SDK中封装为一个叫做WebView组件。
WebView类是WebKit模块Java层的视图类,(所有需要使用Web浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,WebKit模块支持HTTP、HTTPS、FTP以及javascript请求。
WebView作为应用程序的UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问WebKit核心代码。)

什么是webkit
WebKit是MacOSXv10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)同时,
WebKit也是MacOSX的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。
传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。
不过,随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如GoogleChrome和Maxthon3采用V8引擎,却仍然宣称自己是WebKit内核)。
这里我们初步体验一下在android是使用webview浏览网页,

SDK的DevGuide中有一个在WebView的简单例子。在开发过程中应该注意几点:1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Webpagenotavailable错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象。
mWebView.setWebViewClient(newWebViewClient(){publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;}});
mWebView.setWebViewClient(newWebViewClient(){publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;}});
4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,
如果希望浏览的网页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
复制代码代码如下:

publicbooleanonKeyDown(intkeyCode,KeyEventevent){<BR>if((keyCode==KeyEvent.KEYCODE_BACK)&&mWebView.canGoBack()){
mWebView.goBack();
returntrue;
}
returnsuper.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>
functionloadurl(){}
</script>
<selectname="">
<optionvalue=""/>
<optionvalue=""/>
</select>
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setBuiltInZoomControls(true);
webview.loadUrl(file:///...);

5.js对话框(用chom..)
复制代码代码如下:
functionopenAlert(){
window.alert("");
}
functionopenConfirm(){
if(window.confirm("是否删除此信息?")){
window.location="myjs.html";//-------------------!!!
}
}
<inputtype="submit"value="警告"onClick="openAlert()">
<inputtype="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(newMyInterface(),"myobj");//第二步---注册在js中调用的对象名myobj
webview.loadUrl("file:///android_asset/test.html");
//第一步:定义要在js中调用的方法
classMyInterface{
publicStringgetname(){
return"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
}

------------javascript中:-----
复制代码代码如下:
functionmyinterface(){
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函数,告诉他如何处理,如下:
复制代码代码如下:
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(webView.canGoBack()&&event.getKeyCode()==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){
webView.goBack();
returntrue;
}
returnsuper.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
----------------------------------------------------------
当运行提示为webpagenotavailable时去清单文件中添加权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
URLUtil.isNetworkUrl(Stringuri)方法用来判断用户输入的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文件中添加权限,否则出现Webpagenotavailable错误。
<uses-permissionandroid:name="android.permission.INTERNET"/>
下面是具体的例子:
MainActivity.java
复制代码代码如下:
packagecom.android.webview.activity;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.KeyEvent;
importandroid.webkit.WebView;
importandroid.webkit.WebViewClient;
publicclassMainActivityextendsActivity{
privateWebViewwebview;
@Override
publicvoidonCreate(BundlesavedInstanceState){
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(newHelloWebViewClient());
}
@Override
//设置回退
//覆盖Activity类的onKeyDown(intkeyCoder,KeyEventevent)方法
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){
webview.goBack();//goBack()表示返回WebView的上一页面
returntrue;
}
returnfalse;
}
//Web视图
privateclassHelloWebViewClientextendsWebViewClient{
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
view.loadUrl(url);
returntrue;
}
}
}

main.xml
复制代码代码如下:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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文件中添加权限
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.webview.activity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdkandroid:minSdkVersion="10"/>
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<activityandroid:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<uses-permissionandroid:name="android.permission.INTERNET"/>
</manifest>

webview学习记录总结:
首先要在manifest.main文件中创建一个webview,
然后再activity中定义这个webview然后进行以下相关操作。
1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Webpagenotavailable错误。
2、在要Activity中生成一个WebView组件:WebViewwebView=newWebView(this);
3、设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用requestFocus();取消滚动条this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法:
shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,
并传递参数:按下的urlonLoadResourceonPageStartonPageFinishonReceiveErroronReceivedHttpAuthRequest
5、如果访问的页面中有Javascript,则webview必须设置支持Javascript,否则显示空白页面。
Java代码webview.getSettings().setJavaScriptEnabled(true);
6、如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象:Java代码1.mWebView.setWebViewClient(newWebViewClient(){2.3.4.5.6.});
上述方法告诉系统由我这个WebViewClient处理这个Intent,我来加载URL。点击一个链接的Intent是向上冒泡的,
shouldOverrideUrlLoading方法returntrue表示我加载后这个Intent就消费了,不再向上冒泡了。
7、如果不做任何处理,在显示你的BrowerUI时,点击系统“Back”键,整个Browser会作为一个整体“Back"}
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;
到其他Activity中,而不是希望的在Browser的历史页面中Back。