Android 11 下 Toast 变化,不能自定义 Toast 了?


前语

Android 11(R)是2020年的下一代 Android,Google 于上星期发布了 Android 11: Developer Preview 3

在 Android 11 Toast 的行为发生了改变

Android 11 下 Toast 变化,不能自定义 Toast 了?
  1. 制止后台自定义 Toast

  2. text toast 不允许自定义

  3. setView()7 Q ? Z n – 被弃用

  4. 新增 Toast.Callback 回调

Android 11 API 改变

制止后台自定义 Toast

自定义 Toast 不能 在 app 处于后台时显现,取而代之会显现 “Background custom toast blocked for packaw ) V 3 V X J $ge [packageName] See g.co/del o f 0v/toast.” 的文本 toast

Android 11 下 Toast 变化,不能自定义 Toast 了?
制止后台自定义 Toast

普通的 text toast 不受影响

Android 11 下 Toast 变化,不能自定义 Toast 了?
普通的 tJ t % C : Aext toast 不受影响

text toast 不允许自定义

默许的 toast/ N [ G Y ltext toast,如果想运用自定义的 toast ,需求调用 setVw [ _ b | V – +iew() 办法

在 targetSdkVersion 为 R 或更高m t 7 T k a Y时,调用 setGravity 和 setMargin 办法将不进行任何操作

官方文档中所述的 Android Rw z W # # @ N 9 0 仅影响 text toast ,而自定义的 toast 不受影响

Android 11 下 Toast 变化,不能自定义 Toast 了?
调用无效,仅影9 ` R M 响 text toN ` { A D 0 bast
Android 11 下 Toast 变化,不能自定义 Toast 了?
调用无效,仅影响 test toastl 3 8 ~ =

如图,在 test toa, b = _ H M u @st 中调用 setGravitE k + – f V x by 和 setMargin 办法,但 toast 方位并未居中

Android 11 下 Toast 变化,不能自定义 Toast 了?
在 test toast 中调用 setGravity 和 setMargin 办法
Android 11 下 Toast 变化,不能自定义 Toast 了?
并未r – | , p居中,办法不收效

setView() 被弃用

setView() 办法被符号弃用

Deprecated 表明该功用现在Y 3 g } k K ] C仍能够运用,但可能会在将来的 Android 版别中删| H L去。 主张开发人员防止长期运用此功用

Android 11 下 Toast 变化,不能自定义 Toast 了?
setView 被弃用

能够看到,官方在一步步制止自定a T s L ] / V ?c M e A Toast

现在是 targetSdkW a x @Version 为 R 或更高的 app 制止后台弹出自定义 Toast

一起将 setView() 办法符号弃用,当该办法从源码中移除后,自定 Toast 的办法将被彻底消除

i ; 8 z s

当然,官方供给了相应的替代品,运用 Snackbar

新增B E ? a o c p ; z Toast.Callback 回调

添加了新的回调(Toast.Callback),以通知 Toast 显现和躲藏。 能够通过以下办法轻松将其添加到 Toast 中:

valtoast=Toast.makeText(thi% ; T s X _s,R.string.si? u @ b L |mple2 @ 7 W k ^ # Z2_toast,Toast.LENGTH_SHORT)
toast.addCallback(object:Toast.Callback(){
overridefunonToastShown(){
super.onToastShown()
Log.d(TAG,"onToastShown")
}
overri= 9 y A R VdefunonToastHidden({ 8 O I _){
super.onToastHidden()
Log.6 F v 6 _ h 3d(TAG,"onToastHidden")
}
})
toast.show()

一些小 tips 及 demo

demo 在这 ,切换 Flavor 即可指定不同的 targetSdkVe9 1 L C { – ] ^rsion

Android 11 下 Toast 变化,不能自定义 Toast 了?
切换 Flavor

在写 demo 时遇到一些小问题

tip1

Handler() 无参结构办法和 Handler(Handler.Callback) 结构办法 被弃用了

Android 11 下 Toast 变化,不能自定义 Toast 了?
无参结构器被弃用

简单来讲就U N C 5 4是在初始化 Handler 时要显现的装备 Looper

Handler 运用不当会有这样一种 bug,例如i p $ + o ?在子线程通过无参结构函数创立 Handler,您可能会看到这样的反常

Android 11 下 Toast 变化,不能自定义 Toast 了?
过错日志
Android 11 下 Toast 变化,不能自定义 Toast 了?
抛出反常源码

具体内容这里就不讲了,这是 Androm F 8 E 0id 开发者的必备知识

官方通过强制运用传入 Looper 的 Handler 结 7 ) % Y 9构器来防止运用中的问题

tip2

曩昔运用 Toast 结构器创立 Toast 对象 并调用 setText 办法会溃散,K A w L + c =targetSdkVersion 为 R 时不会v d _ 5 G E x $ d溃散

Android 11 下 Toast 变化,不能自定义 Toast 了?
相同的代码 targetSdkVersion 低版别会溃散
Android 11 下 Toast 变化,不能自定义 Toast 了?
溃散,但设置方位收效
Android 11 下 Toast 变化,不能自定义 Toast 了?
反常log
Android 11 下 Toast 变化,不能自定义 Toast 了?
API 29 源码

API 29 中调用 setText() 办法时要保证 mNextV` [ z Q &iew 不为空,而@ d 7 g I } mNextView 是调N ` 0 ` l i {用 setView 赋值的

Android 11 下 Toast 变化,不能自定义 Toast 了?
API 29 setView 源码

因此曩昔运用 Toast 结构器创立 toast 对象无法创立普通的 text toast,必须调用 se* v E c mtViez u | 1 d ;w 办法

至于 API 30 必定在这里做了修改,因为现在看不到源码,我也猜想不出官方的意图

如果各位小伙伴有什么主o ` h j D / J _意欢迎谈论区留言

关于我

我是 Fly_with24

  • 掘金

  • 简书

  • GitF B o j # 5 Y }hub

Android 11 下 Toast 变化,不能自定义 Toast 了?

发表评论

提供最优质的资源集合

立即查看 了解详情