前言

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

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

  • 禁止后台自定义 Toast
  • text toast 不允许自定义
  • setView() 被弃用
  • 新增 Toast.Callback 回调

Android 11 API 变更

禁止后台自定义 Toast

自定义 Toast 「不能」 在 app 处于后台时显示,取而代之会显示 「"Background custom toast blocked for package [packageName] See g.co/dev/toast."」 的文本 toast

禁止后台自定义 Toast

普通的 text toast 不受影响

普通的 text toast 不受影响
text toast 不允许自定义

默认的 toast 是 text toast,如果想使用自定义的 toast ,需要调用 setView()  方法

targetSdkVersion 为 R 或更高时,调用 setGravitysetMargin 方法将不进行任何操作

官方文档中所述的 Android R 仅影响 「text toast」 ,而自定义的 toast 不受影响

调用无效,仅影响 text toast

调用无效,仅影响 test toast

如图,在 test toast 中调用 setGravitysetMargin 方法,但 toast 位置并未居中

在 test toast 中调用 setGravity 和 setMargin 方法

并未居中,方法不生效
setView() 被弃用

setView() 方法被标记弃用

「Deprecated」 表示该功能目前仍可以使用,但可能会在将来的 Android 版本中删除。建议开发人员避免长期使用此功能


可以看到,官方在一步步禁止自定义 Toast

目前是 targetSdkVersion 为 R 或更高的 app 禁止后台弹出自定义 Toast

同时将 setView() 方法标记弃用,当该方法从源码中移除后,自定 Toast 的方式将被彻底消灭

当然,官方提供了相应的替代品,使用 Snackbar

新增 Toast.Callback 回调

添加了新的回调(Toast.Callback),以通知 Toast 显示和隐藏。可以通过以下方法轻松将其添加到 Toast 中:

val toast = Toast.makeText(this, R.string.simple2_toast, Toast.LENGTH_SHORT)toast.addCallback(object : Toast.Callback() { 

override fun onToastShown() {       super.onToastShown()     Log.d(TAG, "onToastShown") }    

override fun onToastHidden() {     super.onToastHidden()      Log.d(TAG, "onToastHidden") }

})toast.show()

一些小 tips 及 demo

demo 在这 ,切换 Flavor 即可指定不同的 targetSdkVersion


在写 demo 时遇到一些小问题

tip1

Handler() 无参构造方法和 Handler(Handler.Callback) 构造方法 被弃用了


简单来讲就是在初始化 Handler 时要显示的配置 Looper

Handler 使用不当会有这样一种 bug,例如在子线程通过无参构造函数创建 Handler,您可能会看到这样的异常

错误日志

抛出异常源码

详细内容这里就不讲了,这是 Android 开发者的必备知识 官方通过强制使用传入 Looper 的 Handler 构造器来避免使用中的问题

tip2

过去使用 Toast 构造器创建 Toast 对象 并调用 setText 方法会崩溃,targetSdkVersion 为 R 时不会崩溃。

相同的代码 targetSdkVersion 低版本会崩溃:


崩溃,但设置位置生效:


异常log:


API 29 源码:


API 29 中调用 setText() 方法时要保证 mNextView 不为空,而 mNextView 是调用 setView 赋值的


因此过去使用 Toast 构造器创建 toast 对象无法创建普通的 text toast,必须调用 setView 方法

至于 API 30 肯定在这里做了修改,由于现在看不到源码,我也猜测不出官方的用意

如果各位小伙伴有什么想法欢迎评论区留言

---END---

推荐阅读:
Binder的一次事务通信数据量分析及优化思路
2020年GitHub 上那些优秀Android开源库,这里是Top10!
优化ApK大小之ABI Filters 和 APK split
太强了,看程序员小姐姐如何用动图展示10大Git命令!
看了微信的暗黑模式后,我也适配了一波安卓!

每一个“在看”,我都当成真的喜欢

thinkphp3.2.3 d方法调用自定义模型_啥?Android 11 不能自定义 Toast 了?相关推荐

  1. android自定义通知栏图标大小,Android不使用自定义布局情况下实现自定义通知栏图标的方法...

    本文实例讲述了Android不使用自定义布局情况下实现自定义通知栏图标的方法.分享给大家供大家参考,具体如下: 自定义通知栏图标?不是很简单么.自定义布局都不在话下! 是的,有xml布局文件当然一切都 ...

  2. arthas 查看哪个方法调用最耗时_火眼金睛,Java诊断利器Arthas

    1 简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 ...

  3. android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...

    本文实例讲述了Android编程实现自定义Dialog的大小自动控制方法.分享给大家供大家参考,具体如下: Android应用开发中,无论是出于功能还是增加用户体验,弹出对话框(Dialog)进行一些 ...

  4. Android实现自定义曲线截屏,Android实现价格走势自定义曲线图

    本文是引用开源图表库框架 MPAndroidChart的LineChart 1.需求: (1)动态添加RadioButton,点击改变下面的LineChart数据 (2)LineChart绘制价格走势 ...

  5. android自定义横竖双向滚动,Android开发实现自定义水平滚动的容器示例

    Android开发实现自定义水平滚动的容器示例 发布时间:2020-09-12 01:25:56 来源:脚本之家 阅读:71 作者:CharlinGod 本文实例讲述了Android开发实现自定义水平 ...

  6. 自定义搜索引擎_如何创建自己的自定义Google搜索引擎

    自定义搜索引擎 Have you ever wanted to create a custom Google search engine that searches only specific web ...

  7. python如何导入自定义模块_【python】导入自定义模块

    一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...

  8. computed set 自定义参数_深入理解vmodel之自定义组件用法

    根据上一篇<深入理解 v-model 之表单用法>基本对 v-model 有了比较深的理解,接下来我们看看它如何在自定义组件中使用. 首先,我们知道下面两个用法等价的: <input ...

  9. python前端调用后端模型_【Python】【Flask】前端调用后端方法

    后端代码: @app.route("/test",methods=['POST','GET']) def test(): return "我是测试的" 前端代码 ...

  10. python前端调用后端模型_前端调用后端的方法(基于restful接口的mvc架构)

    1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在 ...

最新文章

  1. WEBSHELL恶意代码批量提取清除工具
  2. 1008 N的阶乘 mod P ——51Nod(同余定理)
  3. 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
  4. 对四方继保实施嵌入式Linux开发培训
  5. 前端学习(3199):jsx小练习
  6. VS2015配置环境支持opencv3库(网络方法总结)
  7. Spring Boot Logback 配置详解
  8. 换脸软件ZAO被“锤”!微信:我的封杀可能会迟到,但不会缺席
  9. java volatile 基本类型_Java中Volatile关键字详解(转)
  10. EMNLP2021 论文预讲会,邀你一起共赏自然语言处理学术盛宴(日程全公开)
  11. Android中缓存记忆
  12. 帝豪gs车机系统wince_酷车:10万左右买辆“网红车”,名爵ZS和帝豪GS怎么选?...
  13. linux基础命令入门到精通
  14. 《编码:隐匿在计算机软硬件背后的语言》读书笔记
  15. ImageJ 用户手册——第四部分(ImageJ用户界面)
  16. Flutter版讯飞语音识别demo
  17. 从虎胆龙威4(live free or die hard)说黑客攻击
  18. 虚拟机装系统后无法打开系统解决方案
  19. Sqlserver官网下载时各版本含义
  20. 从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(上)

热门文章

  1. 一夜上手uni-app
  2. npm下载地址的查询与切换
  3. vue学习笔记-16-vue的数组方法
  4. win10 C语言qt调试,如何在Windows中调试Qt(MSVC)应用程序
  5. 蕊动矿机linux cpu超频,蚂蚁l3矿机超频方法!最佳超频参数!  |  呆毛网
  6. python优秀源码2019_SUCTF2019,python源码分析,漏洞原理
  7. 白话/图示 sleep_on/wake_up的执行流程
  8. STM32F103ZET6 PWM输出
  9. Python用可变参数找出最大值和最小值
  10. UWP 手绘视频创作工具技术分享系列