`
hylxinlang
  • 浏览: 128699 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    机器学习(预测模型):自行车共享使用情况的数据集

    Capital Bikeshare 数据集是一个包含从2020年5月到2024年8月的自行车共享使用情况的数据集。这个数据集记录了华盛顿特区Capital Bikeshare项目中自行车的租赁模式,包括了骑行的持续时间、开始和结束日期时间、起始和结束站点、使用的自行车编号、用户类型(注册会员或临时用户)等信息。这些数据可以帮助分析和预测自行车共享系统的需求模式,以及了解用户行为和偏好。 数据集的特点包括: 时间范围:覆盖了四年多的时间,提供了长期的数据观察。 细节丰富:包含了每次骑行的详细信息,如日期、时间、天气条件、季节等,有助于深入分析。 用户分类:数据中区分了注册用户和临时用户,可以分析不同用户群体的使用习惯。 天气和季节因素:包含了天气情况和季节信息,可以研究这些因素对骑行需求的影响。 通过分析这个数据集,可以得出关于自行车共享使用模式的多种见解,比如一天中不同时间段的使用高峰、不同天气条件下的使用差异、季节性变化对骑行需求的影响等。这些信息对于城市规划者、交通管理者以及自行车共享服务提供商来说都是非常宝贵的,可以帮助他们优化服务、提高效率和满足用户需求。同时,这个数据集也

Global site tag (gtag.js) - Google Analytics