WebView 简单使用

来源:互联网 发布:fw是什么软件 编辑:程序博客网 时间:2024/06/17 10:34

一、WebView 使用流程


1.权限添加,加载在线URL时,必须有INTERNET权限

<uses-permission android:name="android.permission.INTERNET" />  

2.加载URL

webView.loadUrl(url);

加载本地url格式"file:///android_asset/web.html"

3.设置在Android内跳转,不切换到浏览器

webView.setWebViewClient(newWebViewClient());

4.WebView基本设置

/**  * 是否支持缩放,配合方法setBuiltInZoomControls使用,默认true  */  setSupportZoom(boolean support)    /**  * 是否需要用户手势来播放Media,默认true  */  setMediaPlaybackRequiresUserGesture(boolean require)    /**  * 是否使用WebView内置的缩放组件,由浮动在窗口上的缩放控制和手势缩放控制组成,默认false  */  setBuiltInZoomControls(boolean enabled)    /**  * 是否显示窗口悬浮的缩放控制,默认true  */  setDisplayZoomControls(boolean enabled)    /**  * 是否允许访问WebView内部文件,默认true  */  setAllowFileAccess(boolean allow)    /**  * 是否允许获取WebView的内容URL ,可以让WebView访问ContentPrivider存储的内容。 默认true  */  setAllowContentAccess(boolean allow)    /**  * 是否启动概述模式浏览界面,当页面宽度超过WebView显示宽度时,缩小页面适应WebView。默认false  */  setLoadWithOverviewMode(boolean overview)    /**  * 是否保存表单数据,默认false  */  setSaveFormData(boolean save)    /**  * 设置页面文字缩放百分比,默认100%  */  setTextZoom(int textZoom)    /**  * 是否支持ViewPort的meta tag属性,如果页面有ViewPort meta tag 指定的宽度,则使用meta tag指定的值,否则默认使用宽屏的视图窗口  */  setUseWideViewPort(boolean use)      /**  * 是否支持多窗口,如果设置为true ,WebChromeClient#onCreateWindow方法必须被主程序实现,默认false  */  setSupportMultipleWindows(boolean support)    /**  * 指定WebView的页面布局显示形式,调用该方法会引起页面重绘。默认LayoutAlgorithm#NARROW_COLUMNS  */  setLayoutAlgorithm(LayoutAlgorithm l)    /**  * 设置标准的字体族,默认”sans-serif”。font-family 规定元素的字体系列。  * font-family 可以把多个字体名称作为一个“回退”系统来保存。如果浏览器不支持第一个字体,  * 则会尝试下一个。也就是说,font-family 属性的值是用于某个元素的字体族名称或/及类族名称的一个  * 优先表。浏览器会使用它可识别的第一个值。  */  setStandardFontFamily(String font)    /**  * 设置混合字体族。默认”monospace”  */  setFixedFontFamily(String font)    /**  * 设置SansSerif字体族。默认”sans-serif”  */  setSansSerifFontFamily(String font)    /**  * 设置SerifFont字体族,默认”sans-serif”  */  setSerifFontFamily(String font)    /**  * 设置CursiveFont字体族,默认”cursive”  */  setCursiveFontFamily(String font)    /**  * 设置FantasyFont字体族,默认”fantasy”  */  setFantasyFontFamily(String font)    /**  * 设置最小字体,默认8. 取值区间[1-72],超过范围,使用其上限值。  */  setMinimumFontSize(int size)    /**  * 设置最小逻辑字体,默认8. 取值区间[1-72],超过范围,使用其上限值。  */  setMinimumLogicalFontSize(int size)    /**  * 设置默认字体大小,默认16,取值区间[1-72],超过范围,使用其上限值。  */  setDefaultFontSize(int size)    /**  * 设置默认填充字体大小,默认16,取值区间[1-72],超过范围,使用其上限值。  */  setDefaultFixedFontSize(int size)    /**  * 设置是否加载图片资源,注意:方法控制所有的资源图片显示,包括嵌入的本地图片资源。  * 使用方法setBlockNetworkImage则只限制网络资源图片的显示。值设置为true后,  * webview会自动加载网络图片。默认true  */  setLoadsImagesAutomatically(boolean flag)    /**  * 是否加载网络图片资源。注意如果getLoadsImagesAutomatically返回false,则该方法没有效果。  * 如果使用setBlockNetworkLoads设置为false,该方法设置为false,也不会显示网络图片。  * 当值从true改为false时。WebView会自动加载网络图片。  */  setBlockNetworkImage(boolean flag)    /**  * 设置是否加载网络资源。注意如果值从true切换为false后,WebView不会自动加载,  * 除非调用WebView#reload().如果没有android.Manifest.permission#INTERNET权限,  * 值设为false,则会抛出java.lang.SecurityException异常。  * 默认值:有android.Manifest.permission#INTERNET权限时为false,其他为true。  */  setBlockNetworkLoads(boolean flag)    /**  * 设置是否允许执行JS。  */  setJavaScriptEnabled(boolean flag)    /**  * 是否允许Js访问任何来源的内容。包括访问file scheme的URLs。考虑到安全性,  * 限制Js访问范围默认禁用。注意:该方法只影响file scheme类型的资源,其他类型资源如图片类型的,  * 不会受到影响。ICE_CREAM_SANDWICH_MR1版本以及以下默认为true,JELLY_BEAN版本  * 以上默认为false  */  setAllowUniversalAccessFromFileURLs(boolean flag)      /**  * 是否允许Js访问其他file scheme的URLs。包括访问file scheme的资源。考虑到安全性,  * 限制Js访问范围默认禁用。注意:该方法只影响file scheme类型的资源,其他类型资源如图片类型的,  * 不会受到影响。如果getAllowUniversalAccessFromFileURLs为true,则该方法被忽略。  * ICE_CREAM_SANDWICH_MR1版本以及以下默认为true,JELLY_BEAN版本以上默认为false  */  setAllowFileAccessFromFileURLs(boolean flag)    /**  * 设置存储定位数据库的位置,考虑到位置权限和持久化Cache缓存,Application需要拥有指定路径的  * write权限  */  setGeolocationDatabasePath(String databasePath)    /**  * 是否允许Cache,默认false。考虑需要存储缓存,应该为缓存指定存储路径setAppCachePath  */  setAppCacheEnabled(boolean flag)    /**  * 设置Cache API缓存路径。为了保证可以访问Cache,Application需要拥有指定路径的write权限。  * 该方法应该只调用一次,多次调用自动忽略。  */  setAppCachePath(String appCachePath)    /**  * 是否允许数据库存储。默认false。查看setDatabasePath API 如何正确设置数据库存储。  * 该设置拥有全局特性,同一进程所有WebView实例共用同一配置。注意:保证在同一进程的任一WebView  * 加载页面之前修改该属性,因为在这之后设置WebView可能会忽略该配置  */  setDatabaseEnabled(boolean flag)    /**  * 是否存储页面DOM结构,默认false。        */  setDomStorageEnabled(boolean flag)    /**  * 是否允许定位,默认true。注意:为了保证定位可以使用,要保证以下几点:  * Application 需要有android.Manifest.permission#ACCESS_COARSE_LOCATION的权限  * Application 需要实现WebChromeClient#onGeolocationPermissionsShowPrompt的回调,  * 接收Js定位请求访问地理位置的通知  */  setGeolocationEnabled(boolean flag)    /**  * 是否允许JS自动打开窗口。默认false  */  setJavaScriptCanOpenWindowsAutomatically(boolean flag)    /**  * 设置页面的编码格式,默认UTF-8  */  setDefaultTextEncodingName(String encoding)    /**  * 设置WebView代理,默认使用默认值  */  setUserAgentString(String ua)    /**  * 通知WebView是否需要设置一个节点获取焦点当  * WebView#requestFocus(int,android.graphics.Rect)被调用的时候,默认true  */  setNeedInitialFocus(boolean flag)    /**  * 基于WebView导航的类型使用缓存:正常页面加载会加载缓存并按需判断内容是否需要重新验证。  * 如果是页面返回,页面内容不会重新加载,直接从缓存中恢复。setCacheMode允许客户端根据指定的模式来  * 使用缓存。  * LOAD_DEFAULT 默认加载方式  * LOAD_CACHE_ELSE_NETWORK 按网络情况使用缓存  * LOAD_NO_CACHE 不使用缓存  * LOAD_CACHE_ONLY 只使用缓存  */  setCacheMode(int mode)    /**  * 设置加载不安全资源的WebView加载行为。KITKAT版本以及以下默认为MIXED_CONTENT_ALWAYS_ALLOW方  * 式,LOLLIPOP默认MIXED_CONTENT_NEVER_ALLOW。强烈建议:使用MIXED_CONTENT_NEVER_ALLOW  */  setMixedContentMode(int mode)  

其中,当网站需要登录时,一定要设置如下代码,否则可能会登录无效,重新登录

webView.getSettings().setDomStorageEnabled(true);

如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点

webview.requestFocusFromTouch();  



5.WebView监听

WebViewClient

WebViewClient子类
WebViewClient会在一些影响内容渲染的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到https认证需要处理、页面键盘响应、页面中的url打开处理等等
/**  * 在开始加载网页时会回调  */  public void onPageStarted(WebView view, String url, Bitmap favicon)   /**  * 在结束加载网页时会回调  */  public void onPageFinished(WebView view, String url)  /**  * 拦截 url 跳转,在里边添加点击链接跳转或者操作 
 *在利用shouldOverrideUrlLoading来拦截URL时,如果return true,则会屏蔽系统默认的显示URL结果的行为,不需要处理的URL也需要调用loadUrl()来加载进WebVIew,不然就会出现白屏;如果return false,则系统默认的加载URL行为是不会被屏蔽的,所以一般建议大家return false,我们只关心我们关心的拦截内容,对于不拦截的内容,让系统自己来处理即可。
*/ public boolean shouldOverrideUrlLoading(WebView view, String url) /** * 加载错误的时候会回调,在其中可做错误处理,比如再请求加载一次,或者提示404的错误页面 */ public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) /** * 当接收到https错误时,会回调此函数,在其中可以做错误处理 */ public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) /** * 在每一次请求资源时,都会通过这个函数来回调 */ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return null; }


WebChromeClient子类
/** * 当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数 */public boolean onJsAlert(WebView view, String url, String message,JsResult result)/** * 当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数 */public boolean onJsConfirm(WebView view, String url, String message,JsResult result)/** * 当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数 */ public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result)  /** * 打印 console 信息 */ public boolean onConsoleMessage(ConsoleMessage consoleMessage) /** * 通知程序当前页面加载进度 */ public void onProgressChanged(WebView view, int newProgress)


WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等
1
 

  • WebViewClient:在影响View的事件到来时,会通过WebViewClient中的方法回调通知用户
  • WebChromeClient:当影响浏览器的事件到来时,就会通过WebChromeClient中的方法回调通知用法。



重新Back点击事件

    @Override      public boolean onKeyDown(int keyCode, KeyEvent event) {           //改写物理返回键的逻辑          if(keyCode==KeyEvent.KEYCODE_BACK) {              if(mWebView.canGoBack()) {                  mWebView.goBack();//返回上一页面                   return true;              } else {                  System.exit(0);//退出程序               }          }          return super.onKeyDown(keyCode, event);      }  



参考 http://www.2cto.com/kf/201411/354679.html

参考 http://blog.csdn.net/harvic880925/article/details/51523983

原创粉丝点击