WebView的使用
WebViewextends AbsoluteLayoutimplements ViewGroup.OnHierarchyChangeListener ViewTreeObserver.OnGlobalFocusChangeListenerjava.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()SummaryNested Classesinterface WebView.FindListener 监听查找结果的接口 class WebView.HitTestResult interface WebView.PictureListener不推荐使用此接口在API级别12。该接口是现在已经过时。 class WebView.WebViewTransport返回的WebView跨线程边界传输对象[Expand][Expand]继承XML 属性From class android.view.ViewGroupFrom 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 MethodsvoidaddJavascriptInterface(Object object, String name)将Java对象提供到Web视图booleancanGoBack()获取WebView一个回溯的历史事项booleancanGoBackOrForward(int steps)页面是否后退或前进,或给定数目的后退或前进。booleancanGoForward()获取的WebView有一个向前的历史记录项。booleancanZoomIn()不推荐使用此方法 API level17。这种方法很容易出现不准确的网页渲染和UI线程之间的竞争条件;建议使用onScaleChanged(WebView, float, float).booleancanZoomOut()这种方法被废弃APIlevel17。这种方法很容易由于种族的网页渲染UI线程之间;建议onScaleChanged(WebView, float, float).PicturecapturePicture()捕捉当前WebView的图片voidclearCache(boolean includeDiskFiles)清除资源缓存.voidclearFormData()从目前的表单域自动删除弹出,如果存在的话voidclearHistory()告诉WebView清除其内部的向后/向前列表。voidclearMatches()清除由 findAllAsync(String).创建出的显示强调突出的文本。voidclearSslPreferences()清除存储响应与SSL证书错误.voidclearView()清除此Web视图,如果measurespec不measurespec.exactly。ondraw()将只有白色的背景,并onmeasure()将返回0,voidcomputeScroll()调用父类请求子类更新其mScrollX 和mScrollY的值.WebBackForwardListcopyBackForwardList()获取此Web视图的webbackforwardlist。voiddestroy()销毁WebView的内部状态.booleandispatchKeyEvent(KeyEvent event)调度下一个视图的焦点路径上的关键事件..voiddocumentHasImages(Message response)查询文件,看它是否包含任何图片引用。abstract voiddumpViewHierarchyWithProperties(BufferedWriter out, int level)Dumps custom children to hierarchy viewer.static StringfindAddress(String addr)获取一个物理位置的地址的第一个子串intfindAll(String find)这种方法不推荐 API level 16. 首选findAllAsync(String) voidfindAllAsync(String find)异步的查找网页上所有的实例abstract ViewfindHierarchyView(String className, int hashCode)Returns a View to enable grabbing screenshots from custom children returned in dumpViewHierarchyWithProperties.voidfindNext(boolean forward)滚动并加亮到下一个匹配的 findAllAsync(String), 直到网页边界voidflingScroll(int vx, int vy)voidfreeMemory()通知当前的WebView内存是低的,以便它可以释放任何可用的内存SslCertificategetCertificate()获取主要顶层页的SSL证书,或者null,如果没有证书(该网站是不安全的)。intgetContentHeight()获取的HTML内容的高度。BitmapgetFavicon()获取当前页的图标。WebView.HitTestResultgetHitTestResult()Gets a HitTestResult based on the current cursor node.String[]getHttpAuthUsernamePassword(String host, String realm)对于一个给定的主机和域检索HTTP身份验证凭据.StringgetOriginalUrl()获取当前页面的原始URL..intgetProgress()获取当前页面的进度.floatgetScale()不推荐使用此方法在API等级17。此方法很容易造成不准确的网页渲染和UI线程之间的竞争。建议onScaleChanged(WebView, float, float).WebSettingsgetSettings()获取WebSettings的对象,用于控制设置此WebView.StringgetTitle()获取当前页面的标题.StringgetUrl()获取当前页面的URL.voidgoBack()返回到这个Web视图的历史记录.voidgoBackOrForward(int steps)从当前的步骤数跳转到历史记录的指定步骤数。.voidgoForward()WebView的历史记录前进voidinvokeZoomPicker()当前WebView调用图形变焦选择器.booleanisPrivateBrowsingEnabled()获取此WebView私人浏览是否已启用.voidloadData(String data, String mimeType, String encoding)这个WebView加载 由“data” 给定的数据 构建成的URLvoidloadDataWithBaseURL(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.voidloadUrl(String url)加载此URL.voidloadUrl(String url, Map<String, String> additionalHttpHeaders)加载给定的URL指定额外的HTTP标头.voidonChildViewAdded(View parent, View child)这种方法被废弃在API level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。voidonChildViewRemoved(View p, View child)这种方法被废弃在API level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。InputConnectiononCreateInputConnection(EditorInfo outAttrs)创建一个新的InputConnection InputMethod与视图交互booleanonGenericMotionEvent(MotionEvent event)实现这个方法来处理通用的手势事件voidonGlobalFocusChanged(View oldFocus, View newFocus)不推荐使用此方法 API level3。不应该执行WebView ViewTreeObserver.OnGlobalFocusChangeListener。这种方法现在什么也不做。booleanonHoverEvent(MotionEvent event)实现这个方法来处理悬停事件.voidonInitializeAccessibilityEvent(AccessibilityEvent event)初始化 AccessibilityEvent 事件源信息.voidonInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info)初始化AccessibilityNodeInfo 关于视图的信息.booleanonKeyDown(int keyCode, KeyEvent event)默认实现 KeyEvent.Callback.onKeyDown(): 如果视图是有效并且可点击,执行按下视图直到 KEYCODE_DPAD_CENTER orKEYCODE_ENTER 释放, booleanonKeyMultiple(int keyCode, int repeatCount, KeyEvent event)默认实现 KeyEvent.Callback.onKeyMultiple(): 总是返回false (不处理这个事件).booleanonKeyUp(int keyCode, KeyEvent event)默认 KeyEvent.Callback.onKeyUp(): 执行点击直到 KEYCODE_DPAD_CENTER orKEYCODE_ENTER 释放.voidonPause()暂停WebView和其相关联的DOM,插件,JavaScript 等任何额外的处理voidonResume()恢复webview在onPause()前后.booleanonTouchEvent(MotionEvent event)实现这个方法处理手势事件。.booleanonTrackballEvent(MotionEvent event)实现这个方法处理轨迹球运动事件.voidonWindowFocusChanged(boolean hasWindowFocus)当窗口被扣调用或者失去焦点.booleanoverlayHorizontalScrollbar()获取水平滚动条是否有叠加样式booleanoverlayVerticalScrollbar()Gets whether vertical scrollbar has overlay style.booleanpageDown(boolean bottom)滚动WebView页面大小一半内容booleanpageUp(boolean top)向上滚动WebView页面大小一半内容voidpauseTimers()暂停webview 所有布局,解析,javaScript times计时器booleanperformAccessibilityAction(int action, Bundle arguments)在视图上执行指定的动作booleanperformLongClick()如果被定义将调用调用view的OnLongClickListenervoidpostUrl(String url, byte[] postData)webview使用"Post"方法加载URL ,附带postData 数据。voidreload()重新载入当前URL.voidremoveJavascriptInterface(String name)从这个web视图中移除先前注入的Java对象.booleanrequestChildRectangleOnScreen(View child, Rect rect, boolean immediate)当一组子类需要将一个特殊的矩形定为到屏幕上.booleanrequestFocus(int direction, Rect previouslyFocusedRect)调用该函数来尝试给予指定的视图或者其子类焦点和方向和特定矩形. 直到符合要求 bygetDescendantFocusability().voidrequestFocusNodeHref(Message hrefMsg)请求最后锚点或图像元素的URLvoidrequestImageRef(Message msg)最后一个接触的用户请求的URL的图像WebBackForwardListrestoreState(Bundle inState)这从给定的Bundle对象恢复WebView的状态,voidresumeTimers()恢复WebViews所有的布局,解析和JavaScript计时器voidsavePassword(String host, String username, String password)设置为指定的主机的用户名和密码.WebBackForwardListsaveState(Bundle outState)保存此Web视图使用的状态 onSaveInstanceState(Bundle).voidsaveWebArchive(String filename)保存当前视图作为Web存档.voidsaveWebArchive(String basename, boolean autoname, ValueCallback<String> callback)保存当前视图作为Web存档voidsetBackgroundColor(int color)设置视图的背景颜色voidsetCertificate(SslCertificate certificate)这种方法被废弃APIlevel17。调用这个函数没有有用的效果,并将在以后的版本中被忽略。.voidsetDownloadListener(DownloadListener listener)当内容不能被渲染引擎处理和不应该下载时注册一个接口来使用voidsetFindListener(WebView.FindListener listener)在网页上查找操作进展通知注册监听器voidsetHorizontalScrollbarOverlay(boolean overlay)指定水平滚动条是否有叠加样式voidsetHttpAuthUsernamePassword(String host, String realm, String username, String password)为一个给定的主机和领域存储HTTP身份验证凭据voidsetInitialScale(int scaleInPercent)设置WebView初始比例voidsetLayerType(int layerType, Paint paint)为视图的层指定类别.voidsetLayoutParams(ViewGroup.LayoutParams params)设置此视图关联的布局参数voidsetMapTrackballToArrowKeys(boolean setMap)默认的情况下不推荐使用此方法 API level17。,实际将在未来的版本中支持.voidsetNetworkAvailable(boolean networkUp)通知WebView的网络状态voidsetOverScrollMode(int mode)设置该视图的滚动模式voidsetPictureListener(WebView.PictureListener listener)不推荐使用此方法 API level12。这个方法现在已经过时。.voidsetScrollBarStyle(int style)指定滚动条的样式.voidsetVerticalScrollbarOverlay(boolean overlay)指定垂直滚动条是否有叠加样式.voidsetWebChromeClient(WebChromeClient client)设置脚本处理.voidsetWebViewClient(WebViewClient client)设置WebViewClient会接收到各种通知和请求booleanshouldDelayChildPressedState()如果是按下的状态应推迟到子类或其子类下返回truebooleanshowFindDialog(String text, boolean showIme)在这个页面开始查找文本voidstopLoading()停止当前的加载.booleanzoomIn()执行放大该webViewbooleanzoomOut()执行缩小该webviewProtected MethodsintcomputeHorizontalScrollOffset()计算的水平滚动条上的滑块水平范围内的水平偏移量intcomputeHorizontalScrollRange()计算水平滚动条的水平距离intcomputeVerticalScrollExtent()计算的水平滚动条上的滑块垂直范围内的垂直距离intcomputeVerticalScrollOffset()计算的垂直滚动条上的滑块水平范围内的垂直偏移intcomputeVerticalScrollRange()计算的垂直滚动条的垂直距离.voidonAttachedToWindow()当这个视图连接一个窗口则调用.voidonConfigurationChanged(Configuration newConfig)目前正在使用的应用程序的资源配置改变时调用voidonDetachedFromWindow()当这个视图脱离一个窗口则调用.voidonDraw(Canvas canvas)实现绘制voidonFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)当系统的一个视图的焦点状态改变时调用voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)测量视图和它的内容来确定测量宽度和测量高度.voidonOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)调用 overScrollBy(int, int, int, int, int, int, int, int, boolean) 回应的滚动操作的结果。voidonScrollChanged(int l, int t, int oldl, int oldt)当此视图内部内容滚动时回调此响应 voidonSizeChanged(int w, int h, int ow, int oh)当视图的大小改变期间回调voidonVisibilityChanged(View changedView, int visibility)当视图可见状态或视图的父类可见状态改变.voidonWindowVisibilityChanged(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);//设置支持JavascriptrequestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。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 adapterws.setUseWideViewPort(true);ws.setLoadWithOverviewMode(true);2、页内跳转WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。mWebView.setWebViewClient(new WebViewClient(){@Overridepublic 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的WebChromeClientmWebView.setWebChromeClient(new MyWebChromeClient()); //最后MyWebChromeClient中重写以下方法@Overridepublic 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{@Overridepublic 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() {@Overridepublic boolean onMenuItemClick(MenuItem item) { // TODO 各菜单项事件处理 }}; }2、播放flash1、判断是否安装了flash,若没有跳转到市场安装 http://blog.csdn.net/zircon_1973/article/details/80670412、代码里设置支持flash播放WebSettings ws = mWebView.getSettings();ws.setJavaScriptEnabled(true) ;ws.setPluginsEnabled(true); //Flash supportif(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/77613335、支持视频播放可以参考这个项目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 TypeErrorE/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
?