Android WebView常见问题及解决方案汇总

分享到:

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456

 

Android WebView常见问题解决方案汇总:

就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是乎,一种混合型的app诞生了,灵活多变的部分,如淘宝商城首页的活动页面,一集凡客诚品中我们都可以见到web 页面与native页面的混合,既利用了web app的灵活易更新,也借助了native app本身的效率.
当然,就会用到webview这样的一个控件,这里,我把自己使用过程中遇到的一些问题整理下来.

首先上张图对WebView进行一个基本的回顾:


20131106091520406.jpg

以上思维导图原文件下载地址:

http://download.csdn.net/detail/t12x3456/6509195


然后看一下具体的问题及解决方案:

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

 /**
* 显示自定义错误提示页面,用一个View覆盖在WebView
*/
	protected void showErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent();
initErrorPage();
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
webParentView.addView(mErrorView, 0, lp);
mIsErrorPage = true;
	}
	protected void hideErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent();
mIsErrorPage = false;
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
	}
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") > 0) {
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系统上实现Material design应用
    ​Material Design真的很好看,动画效果真的很实用。前面也写了一些文章介绍如何编写Material风格的程序,但是很多都是一些新的api,低版...
  • Notification详解(含工具类)
    昨天一天只写了两篇文章,效率超低。追其原因呢,其实我一直在研究notification的实现方式,今天研究完了给大家分享一下。本来想写个...
  • Android自动化测试初探: 捕获Activity上的Element
    Android系统下应用程序的测试现在应该还算是个新的领域,网上关于这方面的资料很多都是基于白盒测试的,一般都是基于JUnit框架和Androi...
  • android权限大全
    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOC...
  • Android Toast 使用总结
    本文内容环境演示Toast使用环境Windows2008R264位EclipseADTV22.6.2,Android4.4.3三星SM-G3508,AndroidOS4.1演示Toast使用渐进演示如何使用Toast。图1左:...
  • Android 控件的一些属性--持续更新中...
    归纳一些冷门又可能用到的Android控件属性 1.ListView android:drawSelectorOnTop="true"点击某一条记录,颜色会显示在最上面,记录上的文字被遮...
  • android自定义滑动开关组件【转】
    packagecom.example.wiperswitch; importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.g...
  • 使用ViewPager实现左右循环滑动图片
    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,...
  • 【android】add image in alertdialog
    2011-08-28myfirstandroidapp----摇摇乐第一版即将问世这周总算做了点事情,为结果页增加了icon和pic总结一下问题:为AlertDialog增加图片,图片...
  • Android listview 禁止 itemclick时的高亮显示
    本文转自:http://www.blogjava.net/Green-nut/articles/349031.html 如果我们不关心listview的item单击事件时,最好将单击时的高亮给禁用掉。 方法是在...
  • Android异步加载源码示例_异步加载
    Android异步加载,通过异步加载外部网站的多张图片, 来...介绍和演示Android环境下如何去实现文件异步加载功能, ...想搞Android软件开发...
  • Android的图片处理的一些要点
    我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于...
  • Android SDK Manage 无法更新SDK时的解决方案
    一,问题描述 ADT或者AndroidStudio有时候会经常遇到SDKManage无法更新SDK的情况,这种情况的出现,多半是天朝在做鬼。如果你急等着测试或...
  • Android Fragment 基本介绍
    Fragment Android是在Android3.0(APIlevel11)开始引入Fragment的。 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单...
  • DroidParts 中文系列教程(基于官方教程)(四)- Activity
    DroidParts包含了许多基本的活动类,都是在官方的Activity基础之上融合进了框架的内容(即继承了官方对应的Activity类)。主要包括: o...
  • Android 开源控件系列_2
    FileBrowserView 一个强大的文件选择控件。界面比较漂亮,使用也很简单。特点:可以自定义UI;支持复制、剪切、删除、移动文件;可以用...
  • Android进阶篇-Bitmap操作类
    /** *@authorgongchaobin * *Bitmap工具类 */ publicclassBitmapUtil{ /** *以最省内存的方式读取本地资源的图片或者SDCard中的图片 * *@paramimagePath图片在SD...
  • Android网文
    Android开发:实现带图片和checkbox的listviewhttp://mobile.51cto.com/android-254823.htm Android中调用Restweb服务http://www.ideasandroid.com/archives/429 【Android布...
  • Android之Android WebView常见问题及解决方案汇总
    如有转载,请声明出处:时之沙:http://blog.csdn.net/t12x3456 AndroidWebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又...
  • Android RenderScript 的使用基础篇
    准备上4.0项目,最近接触API的时候看到了RenderScript。通过运行google那几个项目发现这个真是一个非常不错的API,但是google所提供的文档非...