Android 11 下 Toast 變化,不能自定義 Toast 了?

前言

Android 11(R)是2020年的下一代 Android,Google 於上週發佈了 Android 11: Developer Preview 3html

在 Android 11 Toast 的行爲發生了變動android

  1. 禁止後臺自定義 Toastgit

  2. text toast 不容許自定義github

  3. setView() 被棄用web

  4. 新增 Toast.Callback 回調app

Android 11 API 變動

禁止後臺自定義 Toast

自定義 Toast 不能 在 app 處於後臺時顯示,取而代之會顯示 "Background custom toast blocked for package [packageName] See g.co/dev/toast." 的文本 toast編輯器

禁止後臺自定義 Toast
禁止後臺自定義 Toast

普通的 text toast 不受影響ide

普通的 text toast 不受影響
普通的 text toast 不受影響

text toast 不容許自定義

默認的 toast 是 text toast,若是想使用自定義的 toast ,須要調用 setView() 方法函數

在 targetSdkVersion 爲 R 或更高時,調用 setGravity 和 setMargin 方法將不進行任何操做oop

官方文檔中所述的 Android R 僅影響 text toast ,而自定義的 toast 不受影響

調用無效,僅影響 text toast
調用無效,僅影響 text toast
調用無效,僅影響 test toast
調用無效,僅影響 test toast

如圖,在 test toast 中調用 setGravity 和 setMargin 方法,但 toast 位置並未居中

在 test toast 中調用 setGravity 和 setMargin 方法
在 test toast 中調用 setGravity 和 setMargin 方法
並未居中,方法不生效
並未居中,方法不生效

setView() 被棄用

setView() 方法被標記棄用

Deprecated 表示該功能目前仍可使用,但可能會在未來的 Android 版本中刪除。 建議開發人員避免長期使用此功能

setView 被棄用
setView 被棄用

能夠看到,官方在一步步禁止自定義 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

切換 Flavor
切換 Flavor

在寫 demo 時遇到一些小問題

tip1

Handler() 無參構造方法和 Handler(Handler.Callback) 構造方法 被棄用了

無參構造器被棄用
無參構造器被棄用

簡單來說就是在初始化 Handler 時要顯示的配置 Looper

Handler 使用不當會有這樣一種 bug,例如在子線程經過無參構造函數建立 Handler,您可能會看到這樣的異常

錯誤日誌
錯誤日誌
拋出異常源碼
拋出異常源碼

詳細內容這裏就不講了,這是 Android 開發者的必備知識

官方經過強制使用傳入 Looper 的 Handler 構造器來避免使用中的問題

tip2

過去使用 Toast 構造器建立 Toast 對象 並調用 setText 方法會崩潰,targetSdkVersion 爲 R 時不會崩潰

相同的代碼 targetSdkVersion 低版本會崩潰
相同的代碼 targetSdkVersion 低版本會崩潰
崩潰,但設置位置生效
崩潰,但設置位置生效
異常log
異常log
API 29 源碼
API 29 源碼

API 29 中調用 setText() 方法時要保證 mNextView 不爲空,而 mNextView 是調用 setView 賦值的

API 29 setView 源碼
API 29 setView 源碼

所以過去使用 Toast 構造器建立 toast 對象沒法建立普通的 text toast,必須調用 setView 方法

至於 API 30 確定在這裏作了修改,因爲如今看不到源碼,我也猜想不出官方的用意

若是各位小夥伴有什麼想法歡迎評論區留言

關於我

我是 Fly_with24

歡迎關注個人公衆號

相關文章
相關標籤/搜索