WebView的使用

WebView
extends AbsoluteLayout
implements ViewGroup.OnHierarchyChangeListener ViewTreeObserver.OnGlobalFocusChangeListener
java.lang.Object的
   ↳	 android.view.View
 	    ↳	 android.view.ViewGroup
 	  	    ↳	 android.widget.AbsoluteLayout
 	  	  	    ↳	 android.webkit.WebView
类概述
一个显示网页的视图,这个类在您的Activity上可以简单的显示一些在线内容,从而推出自己定制的浏览器。它使用Webkit渲染引擎来显示网页和其他更多功能包括历史记录向前导航,向后,放大和缩小,执行文本搜索。

想要启用内置的缩放,需要设置WebSettings.setBuiltInZoomControls的(boolean)(介绍在API CUPCAKE中)。请注意,为了一个webview在你的Activity访问互联网和加载网页,你必须添加到你的Android的Manifest文件中的Internet权限:

<uses-permission android:name="android.permission.INTERNET" />
这必须是一个元素的子元素。请查看教程: Building Web Apps in WebView.。


基本用法

默认情况下,一个网页不提供任何浏览器的插件,不允许javaScript网页错误不可以被忽略。如果你的目标只是显示一些网页作为用户界面的一部分,
这可能是好的;用户不需要与网页交互。如果你真的想要一个完全成熟的网络浏览器,那么你可能要调用的是浏览器应用程序,而不是一个webview显
示一个URL意图。例如:
 Uri uri = Uri.parse("http://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);
 
更多信息请阅读Intent 意图.。

要提供一个webview在自己的Activity中,包括在你的布局,WebView的窗口设置在Activity的 onCreate():方法中;

 WebView webview = new WebView(this);
 setContentView(webview);
 
然后加载所需的网页:

 // 最简单的用法:注意异常不会被抛出
 // 如果载入此页有错误(见下文)
 webview.loadUrl("http://slashdot.org/");

//或者,你也可以加载一个HTML字符串
 String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview.loadData(summary, "text/html", null);
 // ... 但是请注意这对HTML有限制
 // 更多的信息请看loaddata()和loaddatawithbaseurl()的javadocs文档
 
一个webview有几个自定义点,在这里你可以添加你自己的行为。这些是:

创建和设置WebChromeClient的子类,当浏览器的UI发生变化时调用,如:进度条更改、JavaScript的窗口。
(见Debugging Taskshttp://developer.android.com/tools/debugging/index.html)
创建和设置WebViewClient子类,当底层内容变化时调用,如:错误或表单提交。你也可以再次拦截URL调用。
(通过shouldOverrideUrlLoading())
修改WebSettings,例如:让JavaScript可用--setJavaScriptEnabled().
增加JavaScript-to-Java接口addJavascriptInterface(Object,String)。
可以将java对象绑定到WebView,这样对象可以被网页的JavaScript控制。
下面是一个更复杂的例子,显示的错误处理,设置和进度通知:

 // Let's display the progress in the activity title bar, like the
 // browser app does.
 getWindow().requestFeature(Window.FEATURE_PROGRESS);

 webview.getSettings().setJavaScriptEnabled(true);

 final Activity activity = this;
 webview.setWebChromeClient(new WebChromeClient() {
   public void onProgressChanged(WebView view, int progress) {
     // Activities and WebViews measure progress with different scales.
     // The progress meter will automatically disappear when we reach 100%
     activity.setProgress(progress * 1000);
   }
 });
 webview.setWebViewClient(new WebViewClient() {
   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
   }
 });

 webview.loadUrl("http://slashdot.org/");
 

Cookie和窗口管理

为了安全起见,你的应用程序需要使用自己的缓存,它不共享浏览器应用程序的数据。默认情况下,通过HTML打开新窗口的请求被忽略。无论是通过JavaScript或链路上的目标属性打开,这是真的。你可以定制你的 WebChromeClient 提供你自己打开多个窗口的行为,这可以使你随意控制他们的任何方式。标准的行为是要销毁并重新创建一个活动时,更改设备的方向或任何其他配置。这将导致的WebView重新载入当前页面。如果你不希望出现这种情况,您可以将您的Activity屏幕方向和keyboardHidden的变化,然后单独退出WebView。它会自动重新适配自己。运行时如何处理配置更改请阅读更多信息,Handling Runtime Changes 。

制作支持不同的屏幕密度的网页

一个的移动设备的屏幕密度是根据在屏幕上的分辨率。低密度的屏幕每英寸的可用像素较少,一个高密度屏幕在每英寸像素效果显著更多 - 。一个屏
幕的密度是很重要的,因为,其他条件都相同,在UI元素(例如,一个按钮),其高度和宽度被定义在屏幕像素方面会出现较大的和较小的密度较低的
屏幕上的更高密度的屏幕上。为简单起见,Android折叠所有实际的屏幕密度为:高,中,低三个广义密度。

缺省情况下,web视图缩放一个网页,以便它被绘制在中等密度的屏幕上的尺寸相匹配的默认外观。因此,在高密度屏幕采用1.5倍缩放(因为它的像素较小)和0.75倍缩放一个低密度画面上(因为它的像素大)。开始的WebView支持API级ECLAIR,DOM,CSS,和meta标签的功能,以帮助您作为一个web开发目标不同的屏幕密度的屏幕。这里有一个总结的功能,你可以用它来处理不同的屏幕密度:

 window.devicePixelRatio  DOM属性。此属性的值指定了默认的比例因子,用于当前设备。例如,如果window.devicePixelRatio值是“1.0”,则该设备被认为一个中等密度(MDPI)的移动设备和默认缩放系数不施加到在网页;如果该值是“1.5”,则该设备是认为是一个高密度的移动设备(HDPI)和页面内容进行缩放1.5倍,如果该值是“0.75”,则该设备被认为一个低密度的移动设备(LDPI)和内容缩放0.75倍。但是,如果您指定“目标densitydpi”元属性(下面讨论),那么你可以停止这个默认的缩放行为。
 -webkit-device-pixel-ratio CSS样式查询。使用指定的屏幕密度,该样式表是分别相应的值必须是“0.75”,“1”,或“1.5”,表示方式是低密度
,中密度或高密度的设备,屏幕,分别。比如说:example:
 <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" />
样式表仅用于设备的屏幕像素比为1.5,这是高密度的像素比例。
对于viewport meta标签的target-densitydpi 属性. 你可以指定的Web页面的目标密度,使用以下值:默认缩放将永远不会发生:
device-dpi -使用设备的原始分辨率为目标的DPI。默认缩放不会发生.
high-dpi -使用hdpi、低密度的屏幕缩小适当.
medium-dpi - 使用mdpi. 高密度屏幕的扩大和低密度屏幕缩小
low-dpi -使用ldpi. 中,高密度屏适当扩大.
 -指定要使用的DPI
 DPI值(可接受的值是70-400).
下面是一个meta标签指定目标密度的例子:
<meta name="viewport" content="target-densitydpi=device-dpi" />
如果你想修改网页密度, 就使用 -webkit-device-pixel-ratio  CSS3 Media Query   并/或  window.devicePixelRatio DOM 属性 然后你应该设置 target-densitydpi meta 属性为 device-dpi. 这将阻止Android的在你的网页进行缩放,并允许你为所有像素密度通过CSS和JavaScript做出必要的调整。


HTML5 视频 播放支持

为了支持内联HTML5视频在您的应用程序,你需要开启硬件加速和设置 WebChromeClient,
对于全屏的支持需要onShowCustomView(View, WebChromeClient.CustomViewCallback) 和 onHideCustomView()
可选getVideoLoadingProgressView()

Summary
Nested Classes
interface	 WebView.FindListener	 监听查找结果的接口 
class	 WebView.HitTestResult	  
interface	 WebView.PictureListener	不推荐使用此接口在API级别12。该接口是现在已经过时。  
class	 WebView.WebViewTransport	返回的WebView跨线程边界传输对象
[Expand]

[Expand]
继承XML 属性
From class android.view.ViewGroup
From class android.view.View
常量
String	 SCHEME_GEO	 URI scheme for map address.
String	 SCHEME_MAILTO	 URI scheme for email address.
String	 SCHEME_TEL	 URI scheme for telephone number.
继承的常量
从阶级 android.view.ViewGroup
从类 android.view.View
[展开]
继承的字段
从类 android.view.View
公共构造函数
的WebView(上下文上下文)
一个Context对象构造一个新的WebView。
的WebView(上下文背景下的AttributeSet ATTRS)
构造一个新的WebView与布局参数。
的WebView(上下文背景下的AttributeSet ATTRS,INT defStyle)
构造一个新的WebView与布局参数和默认样式。
的WebView(上下文背景下的AttributeSet ATTRS,INT defStyle,布尔privateBrowsing)
这个构造函数在API等级17是不推荐。私人浏览功能不再支持直接通过WebView,将在未来的版本中删除。不再私自访问 WebSettings,而改用WebViewDatabase,CookieManager 和WebStorage的进行隐私数据操作和细粒度的控制。

Public Methods
void	addJavascriptInterface(Object object, String name)
将Java对象提供到Web视图
boolean	canGoBack()
获取WebView一个回溯的历史事项
boolean	canGoBackOrForward(int steps)
页面是否后退或前进,或给定数目的后退或前进。
boolean	canGoForward()
获取的WebView有一个向前的历史记录项。
boolean	canZoomIn()
不推荐使用此方法  API level17。这种方法很容易出现不准确的网页渲染和UI线程之间的竞争条件;建议使用onScaleChanged(WebView, float, float).
boolean	canZoomOut()
这种方法被废弃APIlevel17。这种方法很容易由于种族的网页渲染UI线程之间;建议onScaleChanged(WebView, float, float).
Picture	capturePicture()
捕捉当前WebView的图片
void	clearCache(boolean includeDiskFiles)
清除资源缓存.
void	clearFormData()
从目前的表单域自动删除弹出,如果存在的话
void	clearHistory()
告诉WebView清除其内部的向后/向前列表。
void	clearMatches()
清除由 findAllAsync(String).创建出的显示强调突出的文本。
void	clearSslPreferences()
清除存储响应与SSL证书错误.
void	clearView()
清除此Web视图,如果measurespec不measurespec.exactly。ondraw()将只有白色的背景,并onmeasure()将返回0,
void	computeScroll()
调用父类请求子类更新其mScrollX 和mScrollY的值.
WebBackForwardList	copyBackForwardList()
获取此Web视图的webbackforwardlist。
void	destroy()
销毁WebView的内部状态.
boolean	dispatchKeyEvent(KeyEvent event)
调度下一个视图的焦点路径上的关键事件..
void	documentHasImages(Message response)
查询文件,看它是否包含任何图片引用。
abstract void	dumpViewHierarchyWithProperties(BufferedWriter out, int level)
Dumps custom children to hierarchy viewer.
static String	findAddress(String addr)
获取一个物理位置的地址的第一个子串
int	findAll(String find)
这种方法不推荐 API level 16.   首选findAllAsync(String) 
void	findAllAsync(String find)
异步的查找网页上所有的实例
abstract View	findHierarchyView(String className, int hashCode)
Returns a View to enable grabbing screenshots from custom children returned in dumpViewHierarchyWithProperties.
void	findNext(boolean forward)
滚动并加亮到下一个匹配的 findAllAsync(String), 直到网页边界
void	flingScroll(int vx, int vy)
void	freeMemory()
通知当前的WebView内存是低的,以便它可以释放任何可用的内存
SslCertificate	getCertificate()
获取主要顶层页的SSL证书,或者null,如果没有证书(该网站是不安全的)。
int	getContentHeight()
获取的HTML内容的高度。
Bitmap	getFavicon()
获取当前页的图标。
WebView.HitTestResult	getHitTestResult()
Gets a HitTestResult based on the current cursor node.
String[]	getHttpAuthUsernamePassword(String host, String realm)
对于一个给定的主机和域检索HTTP身份验证凭据.
String	getOriginalUrl()
获取当前页面的原始URL..
int	getProgress()
获取当前页面的进度.
float	getScale()
不推荐使用此方法在API等级17。此方法很容易造成不准确的网页渲染和UI线程之间的竞争。建议onScaleChanged(WebView, float, float).
WebSettings	getSettings()
获取WebSettings的对象,用于控制设置此WebView.
String	getTitle()
获取当前页面的标题.
String	getUrl()
获取当前页面的URL.
void	goBack()
返回到这个Web视图的历史记录.
void	goBackOrForward(int steps)
从当前的步骤数跳转到历史记录的指定步骤数。.
void	goForward()
WebView的历史记录前进
void	invokeZoomPicker()
当前WebView调用图形变焦选择器.
boolean	isPrivateBrowsingEnabled()
获取此WebView私人浏览是否已启用.
void	loadData(String data, String mimeType, String encoding)
这个WebView加载 由“data” 给定的数据 构建成的URL
void	loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
Loads the given data into this WebView, using baseUrl as the base URL for the content.
void	loadUrl(String url)
加载此URL.
void	loadUrl(String url, Map<String, String> additionalHttpHeaders)
加载给定的URL指定额外的HTTP标头.
void	onChildViewAdded(View parent, View child)
这种方法被废弃在API
 level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。
void	onChildViewRemoved(View p, View child)
这种方法被废弃在API
 level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。
InputConnection	onCreateInputConnection(EditorInfo outAttrs)
创建一个新的InputConnection InputMethod与视图交互
boolean	onGenericMotionEvent(MotionEvent event)
实现这个方法来处理通用的手势事件
void	onGlobalFocusChanged(View oldFocus, View newFocus)
不推荐使用此方法  API level3。不应该执行WebView ViewTreeObserver.OnGlobalFocusChangeListener。这种方法现在什么也不做。
boolean	onHoverEvent(MotionEvent event)
实现这个方法来处理悬停事件.
void	onInitializeAccessibilityEvent(AccessibilityEvent event)
初始化 AccessibilityEvent 事件源信息.
void	onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info)
初始化AccessibilityNodeInfo 关于视图的信息.
boolean	onKeyDown(int keyCode, KeyEvent event)
默认实现 KeyEvent.Callback.onKeyDown(): 如果视图是有效并且可点击,执行按下视图直到 KEYCODE_DPAD_CENTER orKEYCODE_ENTER 释放, 
boolean	onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
默认实现 KeyEvent.Callback.onKeyMultiple(): 总是返回false (不处理这个事件).
boolean	onKeyUp(int keyCode, KeyEvent event)
默认 KeyEvent.Callback.onKeyUp(): 执行点击直到 KEYCODE_DPAD_CENTER orKEYCODE_ENTER 释放.
void	onPause()
暂停WebView和其相关联的DOM,插件,JavaScript 等任何额外的处理
void	onResume()
恢复webview在onPause()前后.
boolean	onTouchEvent(MotionEvent event)
实现这个方法处理手势事件。.
boolean	onTrackballEvent(MotionEvent event)
实现这个方法处理轨迹球运动事件.
void	onWindowFocusChanged(boolean hasWindowFocus)
当窗口被扣调用或者失去焦点.
boolean	overlayHorizontalScrollbar()
获取水平滚动条是否有叠加样式
boolean	overlayVerticalScrollbar()
Gets whether vertical scrollbar has overlay style.
boolean	pageDown(boolean bottom)
滚动WebView页面大小一半内容
boolean	pageUp(boolean top)
向上滚动WebView页面大小一半内容
void	pauseTimers()
暂停webview 所有布局,解析,javaScript times计时器
boolean	performAccessibilityAction(int action, Bundle arguments)
在视图上执行指定的动作
boolean	performLongClick()
如果被定义将调用调用view的OnLongClickListener
void	postUrl(String url, byte[] postData)
webview使用"Post"方法加载URL ,附带postData 数据。
void	reload()
重新载入当前URL.
void	removeJavascriptInterface(String name)
从这个web视图中移除先前注入的Java对象.
boolean	requestChildRectangleOnScreen(View child, Rect rect, boolean immediate)
当一组子类需要将一个特殊的矩形定为到屏幕上.
boolean	requestFocus(int direction, Rect previouslyFocusedRect)
调用该函数来尝试给予指定的视图或者其子类焦点和方向和特定矩形. 直到符合要求 bygetDescendantFocusability().
void	requestFocusNodeHref(Message hrefMsg)
请求最后锚点或图像元素的URL
void	requestImageRef(Message msg)
最后一个接触的用户请求的URL的图像
WebBackForwardList	restoreState(Bundle inState)
这从给定的Bundle对象恢复WebView的状态,
void	resumeTimers()
恢复WebViews所有的布局,解析和JavaScript计时器
void	savePassword(String host, String username, String password)
设置为指定的主机的用户名和密码.
WebBackForwardList	saveState(Bundle outState)
保存此Web视图使用的状态 onSaveInstanceState(Bundle).
void	saveWebArchive(String filename)
保存当前视图作为Web存档.
void	saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback)
保存当前视图作为Web存档
void	setBackgroundColor(int color)
设置视图的背景颜色
void	setCertificate(SslCertificate certificate)
这种方法被废弃APIlevel17。调用这个函数没有有用的效果,并将在以后的版本中被忽略。.
void	setDownloadListener(DownloadListener listener)
当内容不能被渲染引擎处理和不应该下载时注册一个接口来使用
void	setFindListener(WebView.FindListener listener)
在网页上查找操作进展通知注册监听器
void	setHorizontalScrollbarOverlay(boolean overlay)
指定水平滚动条是否有叠加样式
void	setHttpAuthUsernamePassword(String host, String realm, String username, String password)
为一个给定的主机和领域存储HTTP身份验证凭据
void	setInitialScale(int scaleInPercent)
设置WebView初始比例
void	setLayerType(int layerType, Paint paint)
为视图的层指定类别.

void	setLayoutParams(ViewGroup.LayoutParams params)
设置此视图关联的布局参数
void	setMapTrackballToArrowKeys(boolean setMap)
默认的情况下不推荐使用此方法    API level17。,实际将在未来的版本中支持.
void	setNetworkAvailable(boolean networkUp)
通知WebView的网络状态
void	setOverScrollMode(int mode)
设置该视图的滚动模式
void	setPictureListener(WebView.PictureListener listener)
不推荐使用此方法 API level12。这个方法现在已经过时。.
void	setScrollBarStyle(int style)
指定滚动条的样式.

void	setVerticalScrollbarOverlay(boolean overlay)
指定垂直滚动条是否有叠加样式.
void	setWebChromeClient(WebChromeClient client)
设置脚本处理.
void	setWebViewClient(WebViewClient client)
设置WebViewClient会接收到各种通知和请求
boolean	shouldDelayChildPressedState()
如果是按下的状态应推迟到子类或其子类下返回true
boolean	showFindDialog(String text, boolean showIme)
在这个页面开始查找文本
void	stopLoading()
停止当前的加载.
boolean	zoomIn()
执行放大该webView
boolean	zoomOut()
执行缩小该webview
Protected Methods
int	computeHorizontalScrollOffset()
计算的水平滚动条上的滑块水平范围内的水平偏移量

int	computeHorizontalScrollRange()
计算水平滚动条的水平距离

int	computeVerticalScrollExtent()
计算的水平滚动条上的滑块垂直范围内的垂直距离

int	computeVerticalScrollOffset()
计算的垂直滚动条上的滑块水平范围内的垂直偏移

int	computeVerticalScrollRange()
计算的垂直滚动条的垂直距离.

void	onAttachedToWindow()
当这个视图连接一个窗口则调用.
void	onConfigurationChanged(Configuration newConfig)
目前正在使用的应用程序的资源配置改变时调用
void	onDetachedFromWindow()
当这个视图脱离一个窗口则调用.
void	onDraw(Canvas canvas)
实现绘制
void	onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)
当系统的一个视图的焦点状态改变时调用
void	onMeasure(int widthMeasureSpec, int heightMeasureSpec)
测量视图和它的内容来确定测量宽度和测量高度.

void	onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
调用 overScrollBy(int, int, int, int, int, int, int, int, boolean) 回应的滚动操作的结果。
void	onScrollChanged(int l, int t, int oldl, int oldt)
当此视图内部内容滚动时回调此响应 
void	onSizeChanged(int w, int h, int ow, int oh)
当视图的大小改变期间回调
void	onVisibilityChanged(View changedView, int visibility)
当视图可见状态或视图的父类可见状态改变.
void	onWindowVisibilityChanged(int visibility)
当窗口所包含的可见状态改变回调 (between GONE, INVISIBLE, and VISIBLE).



在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等。

使用WebView时需在AndroidManifest.xml添加如下权限,否则会出Web page not available错误。:

<uses-permission android:name="android.permission.INTERNET" />
 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />(有的甚至要加这个权限)
设置WebView基本信息:

mWebview.getSettings().setJavaScriptEnabled(true);//设置支持Javascript
requestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
 
mWebView.loadUrl(“http://www.google.com“); //互联网用
mWebView.loadUrl(“file:///android_asset/XX.html“);//本地文件用  本地文件存放在:assets文件中
一、基本用法

1、设置缩放页面自适应

ws.setSupportZoom(true);	// support zoom
//ws.setDefaultZoom(WebSettings.ZoomDensity.FAR) ;
ws.setBuiltInZoomControls(true);
 
//page auto adapter
ws.setUseWideViewPort(true);
ws.setLoadWithOverviewMode(true);
2、页内跳转

WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。

mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
 //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
  view.loadUrl(url);
  return true;
}
3、加载进度

//此方法可以处理webview 在加载时和加载完成时一些操作
mWebView.setWebChromeClient(new WebChromeClient(){
   @Override
   public void onProgressChanged(WebView view, int newProgress) {
      if(newProgress==100){ 
      // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作
        title.setText(“加载完成”);
      }else{
        title.setText(“加载中…….”);
      }
  }
});
4、错误处理

5、获取网站图标

参考stackoverflow.

//先在onCreate()方法里设置icon存储的路径
WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath());
 
//再设置webview的WebChromeClient
mWebView.setWebChromeClient(new MyWebChromeClient());
 
//最后MyWebChromeClient中重写以下方法
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
        if(icon != null ){
		mIconImgeView.setImageBitmap(icon);
	}
}
6、处理back键

如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

public boolean onKeyDown(int keyCoder,KeyEvent event){
    if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
          webview.goBack(); //goBack()表示返回webView的上一页面
          return true;
     }
     return false;
}
7、使用缓存

WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 优先使用缓存
//WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存
 
 
//退出时删除缓存,可放到 OnDestory()方法里
 
File file = CacheManager.getCacheFileBaseDir();
if (file != null && file.exists() && file.isDirectory()) { 
    for (File item : file.listFiles()) {
        item.delete();
    }
   file.delete();
}
 
mWebView.clearCache(true);
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
二、难点重点

1、长按处理

/**
 *  处理长按弹出的上下文菜单事件,包括网页链接,图片链接等...
 */
class Hao123ContextMenuListener implements OnCreateContextMenuListener{
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
		ContextMenuInfo menuInfo) {
		HitTestResult result =  ((WebView)v).getHitTestResult() ;
		if(null == result)
			return ;
 
		int type = result.getType();
	        if (type == WebView.HitTestResult.UNKNOWN_TYPE)
	             return;
 
	        if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) {
	             // let TextView handles context menu
	             return;
	        }
 
	        MenuInflater inflater = getActivity().getMenuInflater();
	        inflater.inflate(R.menu.browser_menu, menu);
 
	         // Show the correct menu group
	        String extra = result.getExtra();
	        menu.setGroupVisible(R.id.PHONE_MENU,
	                 type == WebView.HitTestResult.PHONE_TYPE);
	        menu.setGroupVisible(R.id.EMAIL_MENU,
	                 type == WebView.HitTestResult.EMAIL_TYPE);
	        menu.setGroupVisible(R.id.GEO_MENU,
	                 type == WebView.HitTestResult.GEO_TYPE);
	        menu.setGroupVisible(R.id.IMAGE_MENU,
	                 type == WebView.HitTestResult.IMAGE_TYPE
	                 || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
	        menu.setGroupVisible(R.id.ANCHOR_MENU,
	                 type == WebView.HitTestResult.SRC_ANCHOR_TYPE
	                 || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
 
	        // Setup custom handling depending on the type
	        Intent intent;
	        switch (type) {
	            case WebView.HitTestResult.PHONE_TYPE:
	                 //处理拨号
	                 break;	
	             case WebView.HitTestResult.EMAIL_TYPE:
                         //处理Email
	                 break;	
	             case WebView.HitTestResult.GEO_TYPE:
                         //TODO
	                 break;	
	             case WebView.HitTestResult.SRC_ANCHOR_TYPE:
	             case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
	             case WebView.HitTestResult.IMAGE_TYPE:
                         // 处理长按图片的菜单项 
	                 break;	
	             default:
	                 break;
	         }
	}
 
	private OnMenuItemClickListener menuItemListener = new OnMenuItemClickListener() {
		@Override
		public boolean onMenuItemClick(MenuItem item) {
		 // TODO 各菜单项事件处理 		 
		}
	};
 
}
2、播放flash

1、判断是否安装了flash,若没有跳转到市场安装 http://blog.csdn.net/zircon_1973/article/details/8067041

2、代码里设置支持flash播放

WebSettings ws = mWebView.getSettings();
ws.setJavaScriptEnabled(true) ;
ws.setPluginsEnabled(true);  //Flash support
if(DeviceInfo.getSDKVersionNumber()>7){
	//flash support since android 2.2 
	ws.setPluginState(PluginState.ON);
	ws.setAllowFileAccess(true);	
}
AndroidManifest里相应的Activity加上如下代码:

 <activity
         android:name=".BrowserActivity"
         ......
         android:hardwareAccelerated="true"
         .......
  >
3、实现点击下载

mWebView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) {
    //实现下载的代码,这里跳转到其他浏览器下载
    Uri uri = Uri.parse(url);
    // Uri uri = Uri.parse("http://www.abc.com/a.apk");如果只下载单个文件
    Intent intent = new Intent(Intent.ACTION_VIEW,uri);
    startActivity(intent);
  }
});
4、cookie保存

http://blog.csdn.net/jdsjlzx/article/details/7761333

5、支持视频播放

可以参考这个项目

6、处理JS事件

三、疑难杂症

1、空白底部

垂直滚动条总是显示白色轨迹底图(无法消掉) 在xml中给WebView设置一下属性发觉不起一点作用:

android:fadeScrollbars = "true"
android:scrollbarStyle = "outsideOverlay"
android:scrollbarAlwaysDrawVerticalTrack = "false"
必须在代码中对WebView进行设置才能奏效:

webview .setScrollbarFadingEnabled( true );
webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
2、Uncaught TypeError

E/Web Console(804): Uncaught TypeError: Cannot call method 'getItem' of null at http://z.cdn.turner.com/cnn/tmpl_asset/static/mobile_phone/2273/js/global-min.js:3
加上以下这句即可:

WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
四、webkit剖析

1、http://mogoweb.net/categories/webkit-research

猜你喜欢

转载自hylxinlang.iteye.com/blog/1893876