测试报了一个bug:连续点三次保存按钮,提示框排队弹了三轮,十几秒才消停。用户早关了页面,toast还在那儿一排排往外冒。这就是最常见的叠加问题,Toast本身是个队列,show一次就排一次队。
基础写法长什么样
Toast.makeText(this, 提示已保存, Toast.LENGTH_SHORT).show();第一个参数是Context,Activity里直接传this,Fragment里用requireContext。第二个是文案,别直接拼字符串,写进strings.xml,国际化的时候不返工。LENGTH_SHORT约2秒,LENGTH_LONG约3.5秒,这个时长系统写死了,传别的数字也没用,自定义时长要自己写Handler模拟。
连续弹窗叠加怎么治
把Toast做成单例,变量存一份,下次show之前先cancel。还有一种常见写法是自定义布局配上单例,布局inflate一次复用,setText只改文案。这样不管用户连点多少下,屏幕上永远只有一个toast在计时。有些团队为了体验,干脆在按钮点击里加500毫秒防抖,叠加从源头上就少了。
后台线程里直接调会崩
网络回调和子线程里调Toast,会报Can't create handler inside thread that has not called Looper.prepare(),因为Toast内部依赖Handler,需要调用线程有消息队列。正确姿势是切回主线程:Activity里用runOnUiThread包一层,Fragment里用requireActivity().runOnUiThread,协程里用withContext(Dispatchers.Main)。
Android 12之后的变化
12之后系统给toast加了应用图标前缀,文案旁边会带上应用名字,同一来源的消息也做了合并。另一个变化是官方不再支持自定义布局,老项目里那种自定义View的toast在高版本上直接失效。要富内容提示就换Snackbar,绑在根布局上,能加操作按钮,还支持左滑关闭。
- Activity已销毁:改用ApplicationContext创建toast,能避开一大半BadTokenException。
- 文案看不清:自定义布局时把底色设深,字号不要低于14sp。