Android 11(R)是2020年的下一代 Android,Google 於上週發佈了 Android 11: Developer Preview 3html
在 Android 11 Toast 的行爲發生了變動android
禁止後臺自定義 Toastgit
text toast 不容許自定義github
setView() 被棄用web
新增 Toast.Callback 回調app
自定義 Toast 「不能」 在 app 處於後臺時顯示,取而代之會顯示 「"Background custom toast blocked for package [packageName] See g.co/dev/toast."」 的文本 toast編輯器
普通的 text toast
不受影響ide
默認的 toast 是 text toast
,若是想使用自定義的 toast ,須要調用 setView() 方法函數
在 targetSdkVersion 爲 R 或更高時,調用 setGravity 和 setMargin 方法將不進行任何操做oop
❝官方文檔中所述的 Android R 僅影響 「text toast」 ,而自定義的 toast 不受影響
❞
如圖,在 test toast 中調用 setGravity 和 setMargin 方法,但 toast 位置並未居中
setView() 方法被標記棄用
❝「Deprecated」 表示該功能目前仍可使用,但可能會在未來的 Android 版本中刪除。 建議開發人員避免長期使用此功能
❞
能夠看到,官方在一步步禁止自定義 Toast
目前是 targetSdkVersion 爲 R 或更高的 app 禁止後臺彈出自定義 Toast
同時將 setView() 方法標記棄用,當該方法從源碼中移除後,自定 Toast 的方式將被完全消滅
❝固然,官方提供了相應的替代品,使用 Snackbar
❞
添加了新的回調(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()
複製代碼
demo 在這 ,切換 Flavor 便可指定不一樣的 targetSdkVersion
在寫 demo 時遇到一些小問題
Handler()
無參構造方法和 Handler(Handler.Callback)
構造方法 被棄用了
簡單來說就是在初始化 Handler 時要顯示的配置 Looper
Handler 使用不當會有這樣一種 bug,例如在子線程經過無參構造函數建立 Handler,您可能會看到這樣的異常
詳細內容這裏就不講了,這是 Android 開發者的必備知識
官方經過強制使用傳入 Looper 的 Handler 構造器來避免使用中的問題
過去使用 Toast 構造器建立 Toast 對象 並調用 setText 方法會崩潰,targetSdkVersion 爲 R 時不會崩潰
API 29 中調用 setText() 方法時要保證 mNextView 不爲空,而 mNextView 是調用 setView 賦值的
所以過去使用 Toast 構造器建立 toast 對象沒法建立普通的 text toast,必須調用 setView 方法
至於 API 30 確定在這裏作了修改,因爲如今看不到源碼,我也猜想不出官方的用意
若是各位小夥伴有什麼想法歡迎評論區留言
我是 Fly_with24
歡迎關注個人公衆號