Android WebView用法

    xiaoxiao2022-06-27  141

    1.简介

    WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。

    2.作用

    ·显示和渲染Web页面 ·直接使用html文件(网络上或本地assets中)作布局 ·可和JavaScript交互调用

       WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

    3. 使用介绍 一般来说Webview可单独使用,可联合其子类一起使用:

    ·Webview自身的常见方法 ·Webview的最常用的子类(WebSettings类、WebViewClient类、WebChromeClient类) ·Android和Js的交互

    3.1 Webview常用方法 3.1.1 加载url

    加载方式根据资源分为三种   //方式1. 加载一个网页:   webView.loadUrl("http://www.google.com/");

      //方式2:加载apk包中的html页面   webView.loadUrl("file:///android_asset/test.html");

      //方式3:加载手机本地的html页面   webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

    // 方式4: 加载 HTML 页面的一小段内容   WebView.loadData(String data, String mimeType, String encoding) // 参数说明: // 参数1:需要截取展示的内容 // 内容里不能出现 ’#’, ‘%’, ‘\’ , ‘?’这四个字符,若出现了需用 #, %, ', ? 对应来替代,否则会出现异常 // 参数2:展示内容的类型 // 参数3:字节码 3.1.1 WebView的状态 //激活WebView为活跃状态,能正常执行网页的响应 webView.onResume() ;

    //当页面被失去焦点被切换到后台不可见状态,需要执行onPause //通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。 webView.onPause();

    //当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webview //它会暂停所有webview的layout,parsing,javascripttimer。降低CPU功耗。 webView.pauseTimers() //恢复pauseTimers状态 webView.resumeTimers();

    //销毁Webview //在关闭了Activity时,如果Webview的音乐或视频,还在播放。就必须销毁Webview //但是注意:webview调用destory时,webview仍绑定在Activity上 //这是由于自定义webview构建时传入了该Activity的context对象 //因此需要先从父容器中移除webview,然后再销毁webview: rootLayout.removeView(webView);  webView.destroy();

    3.1.2 关于前进 / 后退网页 //是否可以后退 Webview.canGoBack()  //后退网页 Webview.goBack()

    //是否可以前进                      Webview.canGoForward() //前进网页 Webview.goForward()

    //以当前的index为起始点前进或者后退到历史记录中指定的steps //如果steps为负数则为后退,正数则为前进 Webview.goBackOrForward(intsteps) 常见用法:Back键控制网页后退 问题:在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身 目标:点击返回后,是网页回退而不是推出浏览器 解决方案:在当前Activity中处理并消费掉该 Back 事件 public boolean onKeyDown(int keyCode, KeyEvent event) {   if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {        mWebView.goBack();       return true;   }   return super.onKeyDown(keyCode, event); }

    3.1.3 清除缓存数据

    //清除网页访问留下的缓存 //由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.Webview.clearCache(true);

    //清除当前webview访问的历史记录 //只会webview访问历史记录里的所有记录除了当前访问记录Webview.clearHistory();

    //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据Webview.clearFormData();

    3.2 常用类 3.2.1 WebSettings类 1、setAllowContentAccess (boolean allow)  是否允许在WebView中访问内容URL(Content Url),默认允许。内容Url访问允许WebView从安装在系统中的内容提 供者载入内容。

    2、setAllowFileAccess (boolean allow)  是否允许访问文件,默认允许。注意,这里只是允许或禁止对文件系统的访问,Assets 和 resources 文件使用 file:///android_asset和 file:///android_res仍是可访问的。 

    3、setAllowFileAccessFromFileURLs (boolean flag)  是否允许运行在一个URL环境(the context of a file scheme URL)中的JavaScript访问来自其他URL环境的内容,为了保证 安全,应该不允 许。也请注意,这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML 单元的访问不受影响。为 了防止相同的域策 略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害, 应该显式地设置此值为false。

    4、setAllowUniversalAccessFromFileURLs (boolean flag)  是否允许运行在一个setAllowFileAccessFromFileURLs(boolean) file schema URL环境下的JavaScript访问来自其他任何来源的内容,包括其 他file schema URLs. 参见 etAllowFileAccessFromFileURLs(boolean),为了确保安全,应该设置为不允许,注意这项设置只影响对 fileschema 资源的 JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy) 对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。ICE_CREAM_SANDWICH_MR1 以及更老的版本此 默认值为 true,JELLY_BEAN以及更新版本此默认值为false 

    5、setAppCacheEnabled (boolean flag)  应用缓存API是否可用,默认值false, 结合setAppCachePath(String)使用。

    6、setAppCachePath(String)  设置应用缓存文件的路径。为了让应用缓存API可用,此方法必须传入一个应用可写的路径。该方法只会执行一次,重复调用会被忽略。

    7、setAppCacheMaxSize (long appCacheMaxSize)  已废弃。设置应用缓存内容的最大值。所传值会被近似为数据库支持的最近似值,因此这是一个指示值,而不是一个固定值。所传值若小于数据库大小 不会让数据库调整大小。默认值是MAX_VALUE,建议将默认值设置为最大值。

    8、setBlockNetworkImage (boolean flag)  是否禁止从网络(通过http和https URI schemes访问的资源)下载图片资源,默认值为false。注意,除非getLoadsImagesAutomatically()返回 true,否则该方法无效。还请注意,即使此项设置为false,使用setBlockNetworkLoads(boolean)禁止所有网络加载也会阻止网络图片的加载。当 此项设置的值从true变为false,WebView当前显示的内容所引用的网络图片资源会自动获取。

    9、setBlockNetworkLoads (boolean flag)  是否禁止从网络下载数据,如果app有INTERNET权限,默认值为false,否则默认为true。使用setBlockNetworkImage(boolean) 只会禁止图片资 源的加载。注意此值由true变为false,当前WebView展示的内容所引用的网络资源不会自动加载,直到调用了重载。如果APP没有INTERNET权限,设 置此值为false会抛出SecurityException。

    10、setBuiltInZoomControls (boolean enabled)  是否使用内置的缩放机制。内置的缩放机制包括屏幕上的缩放控件(浮于WebView内容之上)和缩放手势的运用。通过 setDisplayZoomControls(boolean)可以控制是否显示这些控件,默认值为false。 

    11、setCacheMode (int mode)  重写使用缓存的方式,默认值LOAD_DEFAULT。缓存的使用方式基于导航类型,正常的页面加载,检测缓存,需要时缓存内容复现。导航返回时,内容 不会复现,只有内容会从缓存盘中恢复。该方法允许客户端通过指定LOAD_DEFAULT, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE or LOAD_CACHE_ONLY的其中一项来重写其行为。 

    12、setCursiveFontFamily (String font)  设置WebView字体库字体,默认“cursive”

    13、setDatabaseEnabled (boolean flag)  数据库存储API是否可用,默认值false。如何正确设置数据存储API参见setDatabasePath(String)。该设置对同一进程中的所有WebView实例均有 效。注意,只能在当前进程的任意WebView加载页面之前修改此项,因为此节点之后WebView的实现类可能会忽略该项设置的改变。 

    14、setDatabasePath (String databasePath)  已废弃,数据库路径由实现(implementation)管理,调用此方法无效。  设置数据库的存储路径,为了保证数据库正确运行,该方法必须使用一个应用可写的路径。此方法只能执行一次,重复调用会被忽略。

    15、setDefaultFixedFontSize (int size)  设置默认固定的字体大小,默认为16,可取值1到72

    16、setDefaultFontSize (int size)  设置默认的字体大小,默认16,可取值1到72

    17、setDefaultTextEncodingName (String encoding)  设置默认的字符编码集,默认”UTF-8”.

    18、setDefaultZoom (WebSettings.ZoomDensity zoom)  已废弃。设置默认的缩放密度,必须在UI线程调用,默认值MEDIUM.该项设置在新应用中不推荐使用。如果WebView用于展示手机页面,可以通过调整 页面的’meta viewport’ 标记中的’width’ 和 ‘initial-scale’属性实现预期效果,对于漏用标记的页面,可以使用setInitialScale(int)和 setUseWideViewPort(boolean) . 

    19、setDisplayZoomControls (boolean enabled)  使用内置的缩放机制时是否展示缩放控件,默认值true。参见setBuiltInZoomControls(boolean).

    20、setDomStorageEnabled (boolean flag)  DOM存储API是否可用,默认false。

    21、setEnableSmoothTransition (boolean enable)  已废弃,将来会成为空操作(no-op),设置当panning或者缩放或者持有当前WebView的window没有焦点时是否允许其光滑过渡,若为true, WebView会选择一个性能最大化的解决方案。例如过渡时WebView的内容可能不更新。若为false,WebView会保持精度(fidelity),默认值false。 

    22、setFantasyFontFamily (String font)  设置fantasy字体集(font family)的名字默认为“fantasy”

    23、setFixedFontFamily (String font)  设置固定的字体集的名字,默认为”monospace”。

    24、setGeolocationDatabasePath (String databasePath)  定位数据库的保存路径,为了确保定位权限和缓存位置的持久化,该方法应该传入一个应用可写的路径。

    25、setGeolocationEnabled (boolean flag)  定位是否可用,默认为true。请注意,为了确保定位API在WebView的页面中可用,必须遵守如下约定:  (1) app必须有定位的权限,参见ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION;  (2) app必须提供onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)回调方法的实现,在页面通过 JavaScript定位API请求定位时接收通知。   作为可选项,可以在数据库中存储历史位置和Web初始权限,参见setGeolocationDatabasePath(String).

    26、setJavaScriptCanOpenWindowsAutomatically (boolean flag)  让JavaScript自动打开窗口,默认false。适用于JavaScript方法window.open()。

    27、setJavaScriptEnabled (boolean flag)  设置WebView是否允许执行JavaScript脚本,默认false,不允许。

    28、setLayoutAlgorithm (WebSettings.LayoutAlgorithm l)  设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNS

    29、setLightTouchEnabled (boolean enabled)  已废弃。从 JELLY_BEAN 开始,该设置无效。允许使用轻触摸做出选择和光标悬停。

    30、setLoadWithOverviewMode (boolean overview)  是否允许WebView度超出以概览的方式载入页面,默认false。即缩小内容以适应屏幕宽度。该项设置在内容宽度超出WebView控件的宽度时生效,例 如当getUseWideViewPort() 返回true时。

    31、setLoadsImagesAutomatically (boolean flag)  WebView是否下载图片资源,默认为true。注意,该方法控制所有图片的下载,包括使用URI嵌入的图片(使用setBlockNetworkImage(boolean) 只控制使用网络URI的图片的下载)。如果该设置项的值由false变为true,WebView展示的内容所引用的所有的图片资源将自动下载。

    32、setMediaPlaybackRequiresUserGesture (boolean require)  WebView是否需要用户的手势进行媒体播放,默认值为true。

    33、setMinimumFontSize (int size)  设置最小的字号,默认为8

    34、setMinimumLogicalFontSize (int size)  设置最小的本地字号,默认为8。

    35、setMixedContentMode (int mode)  当一个安全的来源(origin)试图从一个不安全的来源加载资源时配置WebView的行为。默认情况下,KITKAT及更低版本默认

    LOLLIPOP版本默认值MIXED_CONTENT_NEVER_ALLOW,WebView首选的最安全的操作模式为MIXED_CONTENT_NEVER_ALLOW ,不鼓励使用  MIXED_CONTENT_ALWAYS_ALLOW。

    36、setNeedInitialFocus (boolean flag)  调用requestFocus(int, Android.graphics.Rect)时是否需要设置节点获取焦点,默认值为true。

    37、setOffscreenPreRaster (boolean enabled)  当WebView切换到后台但仍然与窗口关联时是否raster tiles,打开它可以避免在WebView从后台切换到前台时重新绘制,默认值false。在这种模 式下后台的WebView占用更多的内存。请按如下准则显示内存的使用: 

    38、WebView的尺寸不能比设备的屏幕尺寸更大; 限制在少数WebView上使用该模式;在可见的WebView和即将显现的WebView上使用;setPluginState (WebSettings.PluginState state)  在API18以上已废弃。未来将不支持插件,不要使用。告诉WebView启用、禁用或者有即用(on demand)的插件,即用模式是指如果存在一个可以处 理嵌入内容的插件,会显示一个占位图标,点击时开启。默认值OFF。

    39、setRenderPriority (WebSettings.RenderPriority priority)  在API18以上已废弃。不建议调整线程优先级,未来版本不会支持这样做。设置绘制(Render,很多书上翻译成渲染,

    貌似很专业,但是不易懂,不敢苟同)线程 的优先级。不像其他设置,同一进程中只需调用一次,默认值NORMAL。

    40、setSansSerifFontFamily (String font)  设置无衬线字体集(sans-serif font family)的名字。默认值”sans-serif”.

    41、setSaveFormData (boolean save)  WebView是否保存表单数据,默认值true。

    42、setSavePassword (boolean save)  API18以上版本已废弃。未来版本将不支持保存WebView中的密码。设置WebView是否保存密码,默认true。

    43、setSerifFontFamily (String font)  设置衬线字体集(serif font family)的名字,默认“sans-serif”。

    44、setStandardFontFamily (String font)  设置标准字体集的名字,默认值“sans-serif”。

    45、setSupportMultipleWindows (boolean support)  设置WebView是否支持多窗口。如果设置为true,主程序要实现onCreateWindow(WebView, boolean, boolean, Message),默认false。

    46、setSupportZoom (boolean support)  WebView是否支持使用屏幕上的缩放控件和手势进行缩放,默认值true。设置setBuiltInZoomControls(boolean)可以使用特殊的缩放机制。

    该项设置不会影响zoomIn() and zoomOut()的缩放操作。 

    47、setTextSize (WebSettings.TextSize t)  API14版本以上已废弃。请取代使用setTextZoom(int)。设置页面文本的尺寸,默认NORMAL。

    48、setTextZoom (int textZoom)  设置页面上的文本缩放百分比,默认100。

    49、setUseWideViewPort (boolean use)  WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时,布局的宽度总是与WebView控件上的设备无关像素(device- dependent pixels)宽度一致。当值为true且页面包含viewport标记,将使用标签指定的宽度。

    如果页面不包含标签或者标签没有提供宽度,那就使用wideviewport。

    50、setUserAgentString (String ua)  设置WebView的用户代理字符串。如果字符串为null或者empty,将使用系统默认值。注意从KITKAT版本开始,加载网页时改变用户代理会让WebView 再次初始化加载。 

    51、supportMultipleWindows ()  获取WebView是否支持多窗口的值。

    52、supportZoom ()  获取WebView是否支持缩放的值 1、setAllowContentAccess (boolean allow)  是否允许在WebView中访问内容URL(Content Url),默认允许。内容Url访问允许WebView从安装在系统中的内容提 供者载入内容。

    3.3 WebView加载提升网页打开的速度 1.加载时先加载文本,后加载图片调用方式如下 WebSettings settings = wView.getSettings();           settings.setJavaScriptEnabled(true);           settings.setBuiltInZoomControls(true);           settings.setBlockNetworkImage(true);   wView.setWebChromeClient(new WebChromeClient() {               @Override               public void onProgressChanged(WebView view, int newProgress) {                   if (newProgress == 100) {                       // 网页加载完成                       loadDialog.dismiss();                       wView.getSettings().setBlockNetworkImage(false);                   } else {                       // 网页加载中                       loadDialog.show();                   }               }           });   2.加入线程 runOnUiThread(new Runnable() {     @Override     public void run() {         WebSettings wSet = web_view.getSettings();         wSet.setJavaScriptEnabled(true);         web_url = “http://www.baidu.com";         web_view.loadUrl(web_url);     } });   原文:https://blog.csdn.net/u014712086/article/details/78629890   


    最新回复(0)