当前位置: 首页 > 编程笔记 >

Android WebView 常见问题及处理方案

杭柏
2023-03-14
本文向大家介绍Android WebView 常见问题及处理方案,包括了Android 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 常见问题及处理方案的全部叙述,希望大家喜欢。

 类似资料:
  • 设备检测处理 Step1: 确认chrome浏览器否开启 摄像头 / 麦克风权限 点击浏览器地址栏最左侧的安全锁图标,或者地址栏最右侧的摄像头图标,修改麦克风 / 摄像头为允许(修改后需要刷新页面) Step2: 确认电脑系统是否允许chrome浏览器使用 摄像头 / 麦克风 请检查系统是否允许浏览器使用摄像头/麦克风,Mac请前往“安全性与隐私”查看,Windows请前往“隐私”查看,修改后需要

  • 本文对 TiFlash 在使用中的常见问题进行解析,并提供处理说明。 TiFlash 常见问题 参阅TiFlash 常见问题。

  • 1. 重置设备 1)盒子拔掉电源 2)按住盒子背后那个小黑钮 3)给盒子插上电源(一直按着小黑钮,等到屏幕出现画面在松开) 2. 解绑流程 *备注:只有管理员具备设备管理和修改的相关权限。 打开钉钉进入底部工作栏选择“智能会议室 点击“设置会议室 选择“设备管理” 选择要解绑的设备 4) 点击右上角解绑 3. 蓝牙配置网络 *备注:只有管理员具备设备管理和修改的相关权限。 用手机钉钉打开右上角“+

  • 不太会使用 Env 工具的请先看一遍 《Env 用户手册》(不长的,看完费不了几分钟) 提示 Env 工具和 源码 所处的目录都不能有中文或空格请先检查!! code 是一个命令 点 ‘.’ 是一个参数表示当前目录,中间有一个空格。 romfs ramfs 文件系统中的文件名和c的变量的命名一样,只能由英文字母开头且仅包含数字和下划线。 修改 qemu.bat 里面的参数时,要注意那是一行参数中间

  • 如何组织我的应用程序? There is no definitive answer to this question. The answer depends on the scale of your application and the team that is involved. To be as flexible as possible, Express makes no assumptio

  • 本文档介绍 DM 中可能存在的、常见的性能问题及其处理方法。 在诊断与处理性能问题时,请确保已经正确配置并安装 DM 的监控组件,并能在 Grafana 监控面板查看 DM 的监控指标。 在诊断性能问题时,请先确保对应组件正在正常运行,否则可能出现监控指标异常的情况,对性能问题的诊断造成干扰。 在诊断问题前,也可以先了解 DM 的性能测试报告。 当数据迁移过程存在较大延迟时,若需快速定位瓶颈是在