关于Toast的一些常见操作
创建一个单例的Toast
使用场景
Toast也被称为吐司,比如说现在有两个地方弹一个吐司,当用户点击了A地方的时候吐司之后,又马上切换到B地方吐司,如果是没有使用单例的话,那么当弹起第一个吐司的时候,时间就会有2-3S的间隔才会弹出第二个吐司.那么给用户的体验就会非常不好.
默认的Toast写法
//如果是使用studio的话,可以打Toast就可以快速的写出这行代码,记得T必须是要大写,否则无法弹出对应的选项
Toast.makeText(MainActivity.this, "这是默认效果的Toast", Toast.LENGTH_LONG).show();
单例Toast:
public class ToastUtil {/*** 第一次弹吐司的string*/private static String oldMsg;protected static Toast toast = null;/*** 第一次弹吐司的时间*/private static long oneTime = 0;/*** 再次弹吐司的时间*/private static long twoTime = 0;public static void showToast(Context context, String s) {if (toast == null) {toast = Toast.makeText(context, s, Toast.LENGTH_SHORT);toast.show();oneTime = System.currentTimeMillis();//当前系统的时间} else {twoTime = System.currentTimeMillis();//再次获取系统的时间//判断传入的string是否与之前传入的string相同if (s.equals(oldMsg)) {//判断两次获取的当前系统时间是否超过默认的吐司时间,超过就再次吐司,否则就不再吐司if (twoTime - oneTime > Toast.LENGTH_SHORT) {toast.show();}} else {oldMsg = s;toast.setText(s);toast.show();}}oneTime = twoTime;}public static void showToast(Context context, int resId) {showToast(context, context.getString(resId));}}
表面上看没什么问题,但是在真实运用过程中,就会出现内存泄漏的问题。原因也很简单,当弹出一个toast的时候,当前页面关闭,但是toast还是引用了context。导致无法GC。所以应该将context变成context.getApplicationContext()。
最终的代码:
public class ToastUtil {/*** 第一次弹吐司的string*/private static String oldMsg;protected static Toast toast = null;/*** 第一次弹吐司的时间*/private static long oneTime = 0;/*** 再次弹吐司的时间*/private static long twoTime = 0;public static void showToast(Context context, String s) {if (toast == null) {toast = Toast.makeText(context.getApplicationContext(), s, Toast.LENGTH_LONG);toast.show();oneTime = System.currentTimeMillis();//当前系统的时间} else {twoTime = System.currentTimeMillis();//再次获取系统的时间if (s.equals(oldMsg)) {//判断两次的string是否相同if (twoTime - oneTime > Toast.LENGTH_LONG) {//判断两次获取的当前系统时间是否超过默认的吐司时间,超过就再次吐司,否则就不再吐司toast.show();}} else {oldMsg = s;toast.setText(s);toast.show();}}oneTime = twoTime;}
public static void showToast(Context context, int resId) {showToast(context, context.getString(resId));}}
自定义Toast
自定义显示位置
Toast toast = Toast.makeText(MainActivity.this, "这是自定义位置的Toast", Toast.LENGTH_LONG);//设置Toast在屏幕上显示的位置toast.setGravity(Gravity.CENTER, 20,80);toast.show();
自定义显示图标:
Toast toast = Toast.makeText(MainActivity.this, "这是带图片的Toast", Toast.LENGTH_LONG);//创建一个子布局用于自定义Toast的内容LinearLayout toastView = (LinearLayout) toast.getView();//在这个子布局中定义一个ImageView用于添加Toast显示的图片ImageView iv= new ImageView(MainActivity.this);iv.setImageResource(R.drawable.p3);//把ImageView添加到子布局当中toastView.addView(iv, 0);toast.show();
完全自定义的:
//创建一个布局,用于承载Toast中的内容LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(R.layout.cell, null);//Toast中的内容之一ImageView用于显示图片ImageView iv = (ImageView) view.findViewById(R.id.iv);iv.setImageResource(R.drawable.p4);//Toast中的内容之二TextView用于显示Toast的标题TextView title = (TextView) view.findViewById(R.id.tv_title);title.setText("注意:");//Toast中的内容之三TextView用于显示Toast的信息内容TextView text = (TextView) view.findViewById(R.id.tv_message);text.setText("这是完全自定义Toast");//创建一个Toast对象Toast toast = new Toast(MainActivity.this);//设置Toast的显示位置为屏幕的右上方toast.setGravity(Gravity.RIGHT | Gravity.TOP, 100,100);//设置Toast的显示时间toast.setDuration(Toast.LENGTH_LONG);//设置Toast显示的布局toast.setView(view);toast.show();
其实就是将一个布局文件显示在Toast上
在线程中使用:
Handler handler = new Handler();public void showToast() {handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "线程中的Toast", Toast.LENGTH_LONG).show();}});}
new Thread(new Runnable() {public void run() {showToast();}}).start();
如果直接在子线程Toast,那么就会报错,:Can’t create handler inside thread that has not called Looper.prepare().至于为什么会这样大家可以参考这个链接.上面有讲的很清楚.
关于Toast的一些常见操作相关推荐
- ArcGIS for Android Runtime100 基本操作(二)——地图控件的常见操作
以前我刚开始学习ArcGIS时候,看得最常见的一篇博客是Ersi中国官方写的一篇<ArcGIS for Android地图控件的5大常见操作>,地址是http://blog.csdn.ne ...
- python设置字符间距_Python中字符串的常见操作技巧总结
本文实例总结了Python中字符串的常见操作技巧.分享给大家供大家参考,具体如下: 反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S ...
- 路径,文件,目录,I/O常见操作汇总
摘要: 文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案 ...
- python字典操作添加_Python字典常见操作实例小结【定义、添加、删除、遍历】
本文实例总结了python字典常见操作.分享给大家供大家参考,具体如下: 简单的字典: 字典就是键值对key-value组合. #字典 键值对组合 alien_0 ={'color':'green', ...
- BOM,DOM常见操作和DHML
BOM (Browser Object Model)浏览器对象模型,控制浏览器的一些行为 window对象 代表一个HTML文档 属性 页面导航的5个属性 self, parent, top, ope ...
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- 在单链表写入一组数据代码_链表常见操作和15道常见面试题
什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...
- python基础实例-Python基础之字符串常见操作经典实例详解
本文实例讲述了Python基础之字符串常见操作.分享给大家供大家参考,具体如下: 字符串基本操作 切片 # str[beg:end] # (下标从 0 开始)从下标为beg开始算起,切取到下标为 en ...
- C#路径/文件/目录/I/O常见操作汇总(一)
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题, 尽量提供一些解决方案,即使没有你想要的答案,也希望能提 ...
- python下selenium模拟浏览器常见操作
本文主要记录下selenium的常见操作,如定位具体元素的不同方法.在具体元素内循环.提取文本等.具体代码如下: # -*- coding: utf-8 -*- ''' Created on 2019 ...
最新文章
- Kubernetes — 容器设计模式
- Rotate List
- 【Python】Flask 框架安装虚拟环境报错—处理中......
- Ant Design Vue select下拉列表设置默认值
- 7.04 -2018-长沙机场笔试总结
- Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题
- 计算机网络是通过通信媒体 把各个独立,计算机网络试题选择题精华
- 英特尔的务实创新之路:实在做技术,赋能开发者 | InfoQ推荐
- Job 存储和持久化 (第二部分)
- 设置谷歌浏览器和Edge浏览器为黑色背景
- R语言中dim函数_R 语言中的矩阵计算
- 熟悉VBA的编程环境---VBE
- Android 12上焕然一新的小组件
- MSSQL 数据库邮件配置
- 查看tcp 请求中的各个状态数据
- 2021-10-20-Flask-01- 基本运行框架及配置文件
- 各种注意事项集合(to be continued)
- 高校校园无线认证计费解决方案
- 【秋招面经】金山前端题目总结
- ([转载]魔百和CM201-2 M8375版安装当贝桌面方法)
热门文章
- 记录一个看着比较顺眼的blockquote的css装饰
- 如何快速打开.pos
- linux apache找不到woff2,IIS Web部署: svg/woff/woff2字体找不到
- 稳压二极管_百度百科
- C#简单实现office转pdf、pdf转图片
- 水浊度传感器( ADC 代码详解)
- 计算机视觉/图像处理领域相关研究机构梳理
- P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
- 1.工作汇报结构: 黄金圈法则结构、PREP结构、时间轴结构、金字塔结构
- 【随机过程】课后作业 1-条件概率期望密度