使用Toast一般会用下面这条语句:

Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();

但有一个问题,如果频繁使用toast会导致其长时间显示。

这和Toast的实现原理是有关系的。
Toast在调用其show方法时,并不是立刻显示出来,而是添加到系统的一个队列中。
而在这个队列中,先添加进去的Toast先被显示出来,所以说,刚show的Toast并不会立刻显示,而是要等队列中之前被添加的Toast显示完之后才可以显示。
而这个队列中是可以保存相当多数量的Toast的,如果你一次性new出多个Toast并将它们都show了一遍,系统就会依次一个个将这些Toast全部显示一遍,时间很长,可能你应用都退了,但是Toast还在显示。

(PS:这种情况并不少见。可能你设置用户点击一次按钮显示一次Toast,谁也不能保证用户不会一直狂按这个按钮。)
这样的情况其实是很影响用户体验的。
但有解决办法。

先贴代码:

private static Toast myToast;
public static void showToast(Context context, String str) {if(myToast == null) {myToast = Toast.makeText(context, str, Toast.LENGTH_SHORT);} else {myToast.setText(str);}myToast.show();}

在new一个Toast之前先判断这个myToast是不是为NULL,如果不是NULL,就不要再去new了,以免队列中存放过多的Toast。
如果不为NULL,只是改变了myToast的显示文字,并调用show()方法。
这样就避免队列中产生大量Toast了。

另外,贴两个自定义Toast的代码:

这是一个添加了一张图片的Toast。
其实看Toast的源码就知道,Android默认的Toast的布局就是一个LinearLayout里面一个TextView。
使用:

(LinearLayout)Toast.getView();

拿到这个View并强转成LinearLayout就可以随意向其中增加或移除View了。

private static Toast myIconToast;
public static void showIconToast(Context context, String str, int resId) {if(myIconToast == null) {myIconToast = Toast.makeText(context, str, Toast.LENGTH_SHORT);myIconToast.setGravity(Gravity.CENTER, 0, 0);LinearLayout toastLinearLayout = (LinearLayout) myIconToast.getView();ImageView imageView = new ImageView(context);imageView.setImageResource(resId);toastLinearLayout.addView(imageView, 0);} else {myIconToast.setText(str);LinearLayout toastLinearLayout = (LinearLayout) myToast.getView();ImageView imageView = new ImageView(context);imageView.setImageResource(resId);toastLinearLayout.removeViewAt(0);toastLinearLayout.addView(imageView, 0);}myIconToast.show();}

第二个是一个完全自定义的Toast,布局由我们自己定义,
利用LayoutInflater拿到我们自定义的布局后,使用:

Toast.setView()

即可实现自定义布局的Toast。

private static Toast myCustomToast;
public static void showCustomToast(Activity activity, String title, String text, int resId) {LayoutInflater inflater = activity.getLayoutInflater();View layout = inflater.inflate(R.layout.custom_toast_layout, null);TextView titleView = (TextView) layout.findViewById(R.id.tvTitleToast);titleView.setText(title);ImageView imageView = (ImageView) layout.findViewById(R.id.tvImageToast);imageView.setImageResource(resId);TextView textView = (TextView) layout.findViewById(R.id.tvTextToast);textView.setText(text);if(myCustomToast == null) {myCustomToast = new Toast(activity);myCustomToast.setGravity(Gravity.RIGHT | Gravity.TOP, 300, 300);myCustomToast.setDuration(Toast.LENGTH_SHORT);myCustomToast.setView(layout);} else {myCustomToast.setView(layout);}myCustomToast.show();}

需要注意的是,这几个方法里使用的Toast都是成员变量。

关于Android Toast相关推荐

  1. [Android] Toast问题深度剖析(二)

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...

  2. android toast的使用

    今天,没有什么可以写的,在网上查找资料,发现toast有很多知识点,所以记录一下. Toast Toast是为了给当前视图显示一个浮动的显示块,它永远不会获得焦点.一般用于提示一些不那么引人注目,但是 ...

  3. 使用Kotlin的Android Toast

    Android Toast is a UI widget that pops up on the screen for some time. It's very similar to a notifi ...

  4. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  5. Android Toast cancel和show深入浅出实战

    说到Android Toast,几乎都很熟悉吧,下面讲讲怎么实现下面几种场景: 1.连续点击一个按钮,每次都产生一个新的Toast并且调用show方法 问题:触发了toast以后,toast内容会一直 ...

  6. 自定义 Android toast 字体大小

    让Android Toast 居中 可以设置 字体大小 Toast toast = Toast.makeText(this, "这是一个简单的自定义Toast", Toast.LE ...

  7. Android Toast 自定义显示时长

    Android Toast 只支持两种时间 LENGTH_SHORT 2 秒,LENGTH_LONG 3.5 秒,但是有场景需要自定义显示时长就会有问题,所以需要自定义实现,下边是自定义的类,通过定时 ...

  8. robotframework + appium 获取android toast

    android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')]  ,该xpath 表示为toast信息含有  "记 ...

  9. qt自定义控件-模拟Android toast提示窗口

    一.前言 好久没写博客了,最近一直写材料,很难受,在家做点小东西,正好遇到了想做的效果,在桌面程序实现Android的toast效果 二.环境 目标机linux,测试机window10 qt5.7 本 ...

  10. Android Toast类

    1. 默认创建 Toast是一种简易的消息提示框,toast提示框不能被用户点击,会根据用户设置的显示时间后自动消失. Toast静态方法makeText(),生成Toast实例,并调用show()方 ...

最新文章

  1. FaceShifter:一秒换脸的人脸交换模型
  2. JAVA 算法练习(二)
  3. 最好的浏览器排行榜_PG是最好的数据库;TiDB 4.0前瞻;SequoiaDB高可用原理;20c DG新特性... 数据库周刊第18期...
  4. html 查询表单,如何让我的HTML表单查询适用于所有表单元素?
  5. javascript乘法和加法_Web前端:JavaScript中的NaN是什么?
  6. modbus注意几点
  7. Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件
  8. 4.大数据架构详解:从数据获取到深度学习 --- 数据获取
  9. 阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型
  10. 超实用的XRD数据定性分析方法,三分钟上手,科研小白变大神!
  11. 一个简单的HTML网页 故宫学生网页设计作品 dreamweaver作业静态HTML网页设计模板 旅游景点网页作业制作
  12. 计算机考研评分标准,考研复试评分标准来啦!
  13. 容器高度或者宽度的获取方式
  14. 笔记工具:幕布 简要使用教程
  15. 王川:小米盒子的产品观
  16. 【原创】MATLAB汽车制动防抱死模型ABS模型
  17. [整站源码]thinkphp古筝古琴书画培训类网站模板+前后端源码
  18. js自定义双击事件(可更改双击触发间隔,解决单击双击事件冲突)
  19. 互联网女皇2013年趋势报告:移动行业仍处早期
  20. 最佳编程笔记本_2020年如何选择最佳笔记本电脑进行编程?

热门文章

  1. 【老沙讲坛】系列之非技术面试题汇总目录
  2. matlab symadd,信号调理器设计—大二暑期信号分析实习报告精选多篇
  3. make clean和make clobber区别
  4. 使用nginx 同一端口根据不同域名转发到不同端口
  5. 5红5绿6蓝穿手链c语言,礼仪习题库(含答案)
  6. proteus 上拉电阻
  7. java入门第二季--面向对象实现人类说话,中国人说汉语,美国人说英语
  8. Linux中UID, GID, EUID, EGID,SUID、SGID讲解
  9. python战舰世界_当下三国杀高玩口中的收益论是否过时/错误,若是,如何正确从理论层面评价武将的强弱 若否 为何?...
  10. 快手国际版Kwai测试海外电商直播,社交App的尽头是直播电商?