Android WebView 常见问题及处理方案

Android WebView 常见问题及处理方案,第1张

概述目前html5发展非常迅速,很多nativeapp都会嵌入到网页中,以此来适用多变的市场需求。但是android的webview默认支持的功能非常弱,很多地方都是需要自定义的,才能达到我们想要的效果。并且webview在不同的版本会有不

目前HTML5发展非常迅速,很多native app都会嵌入到网页中,以此来适用多变的市场需求。但是androID的webvIEw默认支持的功能非常弱,很多地方都是需要自定义的,才能达到我们想要的效果。并且webvIEw在不同的版本会有不同程度的BUG。下面小编把webvIEw经常出现的问题给大家整理如下:

1.为WebVIEw自定义错误显示界面:

  /**  * 显示自定义错误提示页面,用一个VIEw覆盖在WebVIEw  */  protected voID showErrorPage() {  linearLayout webParentVIEw = (linearLayout)mWebVIEw.getParent();  initErrorPage();  while (webParentVIEw.getChildCount() > ) {  webParentVIEw.removeVIEwAt( );  }  linearLayout.LayoutParams lp = new linearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);  webParentVIEw.addVIEw(mErrorVIEw,lp);  mIsErrorPage = true ;  }  protected voID hIDeErrorPage() {  linearLayout webParentVIEw = (linearLayout)mWebVIEw.getParent();  mIsErrorPage = false ;  while (webParentVIEw.getChildCount() > ) {  webParentVIEw.removeVIEwAt( );  }  }  protected voID initErrorPage() {  if (mErrorVIEw == null ) {  mErrorVIEw = VIEw.inflate( this,R.layout.online_error,null );  button button = (button)mErrorVIEw.findVIEwByID(R.ID.online_error_btn_retry);  button.setonClickListener( new OnClickListener() {  public voID onClick(VIEw v) {  mWebVIEw.reload();  }  });  mErrorVIEw.setonClickListener( null );  }  }

2.WebVIEw cookies清理:

cookieSyncManager.createInstance( this );  cookieSyncManager.getInstance().startSync();  cookieManager.getInstance().removeSessioncookie();

3.清理cache 和历史记录:
复制代码 代码如下:
    webVIEw.clearCache( true );
    webVIEw.clearHistory();

4.判断WebVIEw是否已经滚动到页面底端:
    getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
    getHeight()或者getBottom()方法都返回当前WebVIEw 这个容器的高度
    getContentHeight 返回的是整个HTML 的高度,但并不等同于当前整个页面的高度,因为WebVIEw 有缩放功能,所以当前整个页面的高度实际上应该是原始HTML 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:
   

 if (WebVIEw.getContentHeight*WebVIEw.getScale() == (webvIEw.getHeight()+WebVIEw.getScrollY())){ //已经处于底端 }

5.URL拦截:
AndroID WebVIEw是拦截不到页面内的fragment跳转的。但是url跳转的话,又会引起页面刷新,H5页面的体验又下降了。只能给WebVIEw注入Js方法了。
6.处理WebVIEw中的非超链接请求(如AJAX请求):
有时候需要加上请求头,但是非超链接的请求,没有办法再shouldOverrinding中拦截并用webVIEw.loadUrl(String url,HashMap headers)方法添加请求头
目前用了一个临时的办法解决:
首先需要在url中加特殊标记/协议,如在onWebVIEwResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾
在shouldInterceptRequest()方法中,可以拦截到所有的网页中资源请求,比如加载Js,图片以及AJAX请求等等

Ex:  @Suppresslint ( "NewAPI" )  @OverrIDe  public WebResourceResponse shouldInterceptRequest(WebVIEw vIEw,String url) {  // 非超链接(如AJAX)请求无法直接添加请求头,现拼接到url末尾,这里拼接一个imei作为示例  String AJAXUrl = url;  // 如标识:req=AJAX  if (url.contains( "req=AJAX" )) {  AJAXUrl += "&imei=" + imei;  }  return super .shouldInterceptRequest(vIEw,AJAXUrl);  }

7.在页面中先显示图片:
   

@OverrIDe  public voID onLoadResource(WebVIEw vIEw,String url) {  mEventListener.onWebVIEwEvent(CustomWebVIEw. this,OnWebVIEwEventListener.EVENT_ON_LOAD_RESOURCE,url);  if (url.indexOf( ".jpg" ) > ) {  hIDeProgress(); //请求图片时即显示页面  mEventListener.onWebVIEwEvent(CustomWebVIEw. this,OnWebVIEwEventListener.EVENT_ON_HIDE_PROGRESS,vIEw.getUrl());  }  super .onLoadResource(vIEw,url);  }

8.屏蔽掉长按事件 因为webvIEw长按时将会调用系统的复制控件:
   

mWebVIEw.setonLongClickListener( new OnLongClickListener() {  @OverrIDe  public boolean onLongClick(VIEw v) {  return true ;  }  });

9.在WebVIEw加入 flash支持:
  

 String temp = "<HTML><body bgcolor=/"" + "black"  + "/"> <br/><embed src=/"" + url + "/" wIDth=/"" + "100%"  + "/" height=/"" + "90%" + "/" scale=/"" + "noscale"  + "/" type=/"" + "application/x-shockwave-flash"  + "/"> </embed></body></HTML>" ;  String mimeType = "text/HTML" ;  String enCoding = "utf-8" ;  web.loadDataWithBaseURL( "null",temp,mimeType,enCoding,"" );

以上内容就是本文针对AndroID WebVIEw 常见问题及处理方案的全部叙述,希望大家喜欢。

总结

以上是内存溢出为你收集整理的Android WebView 常见问题及处理方案全部内容,希望文章能够帮你解决Android WebView 常见问题及处理方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1141521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存