Android WebView

WebView 类是 WebKit 模块 Java 层的视图类, 所有需要使用 Web 浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源,接下来将详细介绍,需要了解的朋友可以参考下


在 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)

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中调用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获得焦点等等
(2)设置WebViewClient子类, --WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等
(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) 

--webView.canGoBack():在webView含有一个可后退的浏览记录时返回true 
if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
webView.goBack(); --表示返回webView的上次访问页面 
return true; 

return super.onKeyDown(keyCode, event); 



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( )方法,设置WebView要显示的网页 
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。 

你可能感兴趣的:(android,浏览器,webkit,webView)