Android Toast cancel和show深入浅出实战
说到Android Toast,几乎都很熟悉吧,下面讲讲怎么实现下面几种场景:
1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法
问题:触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失
2、连续点击一个按钮,缓存一个Toast,每次都调用show方法
推荐:这种方式体验感觉最好,Toast消失的计时会从最后一次show之后才开始计算,还可以通过setText设置不同的内容
3、连续点击一个按钮,缓存一个Toast,每次先调用cancel再调用show方法
问题:这里有坑,可能cancel之后就show不出来了
4、别人封装的一个列子,介绍了Toast其他的一些问题
http://blog.csdn.net/goodding/article/details/8792628
http://blog.csdn.net/arui319/article/details/7022392
下面看下上面1-3种方式的代码写法:
1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法,这个没什么好说的,都会写
Toast.makeText(context, "要显示的提示", Toast.LENGTH_LONG).show();
2、连续点击一个按钮,缓存一个Toast,每次都调用show方法(推荐写法,体验比较好)
private Toast mShowingToast; private void showTestToast() { // mActivity是一个Activity对象,弹Toast一般用Activity类型的Context if (mShowingToast == null) { mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG); } mShowingToast.show(); }
3、连续点击一个按钮,缓存一个Toast,每次先调用cancel再调用show方法 (容易踩坑的地方)
private Toast mShowingToast; private void showTestToast() { // mActivity是一个Activity对象,弹Toast一般用Activity类型的Context if (mShowingToast == null) { mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG); } mShowingToast.cancel(); mShowingToast.show(); // 会发现cancel之后调用show是show不出来的 }
上面这种方式会发现Toast显示不出来,改下写法也许读者能猜到为什么
private Toast mShowingToast; // 主线程的Handler对象 private Handler mHandler = new Handler(Looper.getMainLooper()); private void showTestToast() { // mActivity是一个Activity对象,弹Toast一般用Activity类型的Context if (mShowingToast == null) { mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG); } mShowingToast.cancel(); mHandler.postDelayed(new Runnable() { @Override public void run() { mShowingToast.show(); // 会发现延迟之后就显示出来了 } }, 200); // 这个时间是自己拍脑袋写的,不影响体验就好,试过使用post也不行 }
为什么呢?可能是同步异步的问题,有可能show操作被后续执行的cancel给覆盖了,所以不生效,看了下源码也没具体看出来
/** * Show the view for the specified duration. */ public void show() { if (mNextView == null) { throw new RuntimeException("setView must have been called"); } INotificationManager service = getService(); String pkg = mContext.getOpPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } } /** * Close the view if it's showing, or don't show it if it isn't showing yet. * You do not normally have to call this. Normally view will disappear on its own * after the appropriate duration. */ public void cancel() { mTN.hide(); try { getService().cancelToast(mContext.getPackageName(), mTN); } catch (RemoteException e) { // Empty } } 这是Toast内部内TN的一个方法 /** * schedule handleHide into the right thread */ @Override public void hide() { if (localLOGV) Log.v(TAG, "HIDE: " + this); mHandler.post(mHide); }
如果有读者知道上述问题的原因,欢迎回帖
Android Toast cancel和show深入浅出实战相关推荐
- Android 5.x Theme 与 ToolBar 实战
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45303349: 本文出自:[张鸿洋的博客] 1.概述 随着Material ...
- Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...
- Android Toast 自定义显示时长
Android Toast 只支持两种时间 LENGTH_SHORT 2 秒,LENGTH_LONG 3.5 秒,但是有场景需要自定义显示时长就会有问题,所以需要自定义实现,下边是自定义的类,通过定时 ...
- Android Toast类
1. 默认创建 Toast是一种简易的消息提示框,toast提示框不能被用户点击,会根据用户设置的显示时间后自动消失. Toast静态方法makeText(),生成Toast实例,并调用show()方 ...
- 《Android传感器开发与智能设备案例实战》——导读
本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的目录,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 ...
- [Android] Toast问题深度剖析(二)
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...
- 5G 时代的 Android App 开发入门与项目实战
随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...
- 《Android传感器开发与智能设备案例实战》——第2章,第2.4节安装ADT
本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的第2章,第2.4节安装ADT,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- 《Android传感器开发与智能设备案例实战》——第1章,第1.2节Android的巨大优势...
本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的第1章,第1.2节Android的巨大优势,作者 朱元波,更多章节内容可以访问云栖社区"异步社区&quo ...
最新文章
- 曝光原理_PS教程:双重曝光的原理及制作过程,魔术棒及调整边缘的简易抠图...
- Atitit.异步编程 java .net php python js 对照
- android文章链接
- 蓝桥练习题题解——作物杂交——Java
- P3957-跳房子【单调队列,dp,二分】
- 乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界
- SQL Server如何链接到 Oracle并查询其中的数据?并实现做接口
- Java经典实例:进阶版堆栈实现,支持任何对象类型
- 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
- 人工智能在安全漏洞方面的应用_智慧消防平台的智慧在哪方面?
- Android应用程序键盘(Keyboard)消息处理机制分析(19)
- 【转】NSBundle的使用,注意mainBundle和Custom Bundle的区别
- Ruby on Rails快速创新性能的终极指南
- 论信贷企业信用评级与债券信用评级的关系
- redis哨兵集群、docker入门
- 微信应用签名配置方法
- 华硕ac86u文件服务器,数码教程资讯:华硕RT-AC86U路由器怎么设置FTP共享服务
- 使用Python+Pandas+Statsmodels建立线性回归模型预测房价
- html实现圆形计时器特效,如何用css3实现圆形倒计时
- 【图像处理】像素坐标系、像平面坐标系、相机坐标系、世界坐标系、内参矩阵、外参矩阵
热门文章
- Wordpress转移数据表后出现You do not have sufficient permissions to access this page的解决方法...
- 安装Oracle 11g报错 This is a prerequisite condition to test whether sufficient total swap space is avail
- 离散数学-图论知识总结(修改版)
- SPICE二极管直流分析原理
- iOS Developer:真机测试
- 采用html 的a标签,href连接为文件时无法下载解决方案
- 数字中国建设意义和面临的挑战
- java 保存file_java保存文件
- 网上购车平台上私户,不一样的上私户购车体验
- 一夜之间!京东市值涨350亿,拼多多涨550亿,阿里涨1400亿