今天在项目中遇到这样一个问题 :
同一个页面要求多次显示气泡消息Toast,即重复显示,重复显示的问题网上有解决方案,下面还会有介绍,我这里已经解决这个,真正碰到的问题来了,我用了不同的设备(设备主要区别是系统版本不同,一个android2.2,一个2.3.6,一个4.1.1)对程序功能进行测试,结果发现有的能正常显示,有的却只显示第一个Toast,后面的不再显示。
好了 问题描述完成,下面是解决过程:
1.Toast重复显示问题(为什么要说明这个呢?继续看你就知道了)
Toast重复显示不能直接重复编写,需要处理一下以避免造成用户使用的不便,详细解决方案请参考:http://mwxboy.diandian.com/post/2012-04-25/19583598,关键代码粘贴一下:
private static void showMessage(Context context,String aMsg, int gravity, int xOffset, int yOffset)
{
//第一调用showMessage()进的是else,同一页面第二次调用进的是if,因为context相同
if(mContext == context)
{
mToast.cancel();//这句是造成后面问题的关键
mToast.setText(aMsg);
}
else
{
mContext = context;
mToast = Toast.makeText(mContext, null, 0);
mToast.setGravity(gravity, xOffset, yOffset);
mToast.setText(aMsg);
}
mToast.show();
}
2.用上面的代码是解决了android中Toast的重复显示问题,但是注意,这个方法在Android 4.0版本以下的系统中不会引起我碰到的那个问题(这是我后面才发现的)。看完上面的代码,我打算研究了一下Toast的cancel()方法(因为考虑引起后面问题的是不是Toast占用和释放的原因,而Toast中的cancel()就是这样一个类似功能的方法),从网上一篇相关文章中得到启示,地址:http://dkmeteor.iteye.com/blog/1399646,
最主要的启示是该文章的最后几句:
2月28日追加:
实测 在2.2 2.3中此方法工作良好。
在4.0系统中效果极差
多次触发Toast 无法正常显示
从这几句话我确定了是cancel()在4.0系统中的使用有问题,于是我试着把 mToast.cancel();这句代码注释掉,调试通过,问题居然就解决了 ,在2.2和2.3中也没有问题了 。
由于花了点时间解决这个bug,所以记录下来给自己也给大家分享一点经验,可能不是完全正确,欢迎大家拍砖!
2013.01.18追加:
今天网上搜索android4.0 Toast.cancel()发现这篇文章,地址:http://blog.csdn.net/sylcc_/article/details/7396452,里面介绍了4.0中cancel源码和其他版本的不同,从这里得到昨天碰到问题的根本原因,在此感谢该文章的原创作者。下面贴出里面的一个片段:
”下面是2.2和4.0中Toast源码的链接:
http://www.oschina.net/code/explore/android-2.2-froyo/android/widget/Toast.java
http://www.oschina.net/code/explore/android-4.0.1/core/java/android/widget/Toast.java
比较两者关于cancel()处理的差异发现了如下差异:
在4.0中如下:
final Runnable mHide = new Runnable() {
public void run() {
handleHide();
// Don't do this in handleHide()because it is also invoked by handleShow()
mNextView = null;
}
};
而2.2中没有mNextView = null;这一行代码。
再查看show()中有如下源码:
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
所以判断产生的Bug的原因是2.2系统和4.0系统对cancel的处理的差异造成的,将cancel注释就可以正常显示了。“
但是4.0以下系统需要用到cancel()怎么办?下面是另一篇文章 http://blog.csdn.net/gouguofei/article/details/7814195 给出的一个解决办法,贴出片段:
“但是注释掉以后对4.0以下的系统需要cancel()怎么办呢,这里我的解决办法是在程序里获取系统版本,如果是4.0及以上就不执行cancel(),否则执行cancel()。 ”
获取系统版本比较简单:int version = Integer.valueOf(android.os.Build.VERSION.SDK) 即可获得
相关推荐
spring-context-1.2.8.jar, spring-context-1.2.9.jar, spring-context-2.0-m2.jar, spring-context-2.0.1.jar, spring-context-2.0.2.jar, spring-context-2.0.4.jar, spring-context-2.0.6.jar, spring-context-...
本文将深入探讨如何在Android中实现气泡布局,包括其基本原理、自定义View的创建以及在实际项目中的应用。 首先,气泡布局的基本特征是它具有一个圆形或近似圆形的头部,通常包含一个图标或文字,然后有一条指向...
弹出框样式的载入视图效果。项目地址:https://github.com/saiwu-bigkoo/Android-SVProgressHUD 效果图:如何使用使用超简单:SVProgressHUD.show(context);ok.另外,还有其他方式打开:比如,有关遮挡背景的:...
3. **绘制优化**:在低版本Android中,GIF动图可能会出现绘制错误或显示不全的问题。`android-gif-drawable`通过自定义渲染策略解决了这些问题,保证了GIF的完整展示。 4. **控制功能**:原生Android对GIF的控制...
[开源][安卓][炫酷菜单]Context-Menu.Android-master Git上的炫酷菜单源码
Android-Context-Menu.Android.zip,你可以很容易地添加令人敬畏的动画上下文菜单到你的应用程序。,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有...
4、Android04--Android服务 5、Android05--Android服务通信 6、Android06--Android广播接收器 7、Android07--Android日志系统 8、Android08--Android权限系统 用户界面 9、Android09--Fragment初探 10、Android09--...
jar包分享,你懂的 spring-context.jar spring-context.jar spring-context.jar spring-context.jar spring-context.jar
此资源"安卓消息推送通知栏相关-Android--CardView新闻展示推送效果.rar"主要关注如何利用CardView组件来构建美观且实用的新闻展示推送效果。CardView是Android支持库中的一个视图容器,它为内容提供了一个带有阴影...
在Android开发中,`android-support-v4`库是Google提供的一款重要的支持库,它使得开发者能够在更低版本的Android系统上使用一些新版本引入的功能。这个库包含了大量的类和方法,帮助开发者实现对Android API的兼容...
《Android-Universal-Image-Loader:高效加载...通过学习和使用Android-Universal-Image-Loader,开发者可以构建出更加流畅、用户体验优良的应用,尤其是在处理大量图片时,其强大的功能和优秀的性能将体现得尤为明显。
spring-context-support-4.0.0.M2.jar 需要用到的可以下载
在Android开发中,为了增强用户体验,我们经常需要创建各种类型的弹出界面,如对话框(Dialog)和PopupWindow。在给定的标题“用Dialog实现的主动弹出式气泡”和描述中,我们看到一个特定的需求:创建一个能够主动弹...
spring-context-support.jar spring整合任务调度quartz必需jar 还需要quartz-all-x.x.x.jar quartz版本必需在1.8.x以下
首先,我们要理解Android中的弹出框(Dialog)是一种轻量级的窗口,它浮于应用程序主窗口之上,用于展示临时信息或进行简单的交互操作。Android SDK提供了多种预定义的Dialog样式,如AlertDialog、ProgressDialog等...
这个功能在很多应用场景中都非常有用,比如在登录、注册或者评论等场景,用户可能需要在全屏界面中弹出一个Dialog进行输入。 首先,让我们了解Dialog的基本概念。Dialog是Android中一种轻量级的窗口组件,它通常...
在Android应用开发中,了解和控制应用程序的Activity堆栈是非常重要的。"TopActivity"这个概念就是用来描述在当前运行的应用中位于最顶端的那个Activity。它代表着用户当前正在交互的界面,是用户可见并且可以直接...
spring核心jar包,spring-context jar包,下一个是core
在Android开发中,底部弹出菜单(通常称为Bottom Sheet或者PopupWindow)是一种常见的交互元素,用于展示临时性的操作选项或信息。本篇文章将详细讲解如何创建一个带有透明背景的底部弹出菜单,以及相关的实现技术和...
大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml...