Android 11 (R) это следующее поколение ОС Android, которое выйдет в 2020 году. В начале апреля Google опубликовал Android 11 Preview 2.1 для ознакомления разработчикам. Там есть множество изменений и одно из них зацепило моё внимание – новое поведение тостов (Toast) и ограничения по кастомизации.
В Android 11 (R), Google вносит следующие изменения в Toast (и потом о каждом подробнее):
1. Отображение кастомизированх тостов для фоновых приложений запрещено
2. Текстовые тосты больше не могут быть изменены
3. setView() — помечена как Deprecated
4. Новенький колбек для тостов
Введение в тосты
Тосты (Toast) – простой виджет, отображаемый поверх приложений. Обычно его используют для отображения простой информации пользователю, вроде отсутствия интернета. Элегантная плавная анимация появления и исчезновения сопутствует отображению тостов.
1 2 3 4 |
// Method 1: Public constructor val simpleToast = Toast(this) // Method 2: Static constructor val textToast = Toast.makeText(this, "Simple toast message", Toast.LENGTH_SHORT) |
Существует два различных вида тостов. Один — «простой» тост, который может быть создан посредством прямого вызова конструктора, а второй, «текстовый», может быть создан при помощи статического метода:
1 |
Toast(context: Context, text: CharSequence, duration: Int) |
Предупреждения для Android R в официальной документации имеют отношение только к текстовым тостам. Прежде чем продолжать, убедитесь, что чётко их различаете.

Изменения в Android 11 (API 30)
1. Фоновые кастомные посты запрещены

1 2 3 4 5 6 7 |
val customToast = Toast(this).also { val view = LayoutInflater.from(context).inflate(R.layout.foo_custom_toast, null) it.setView(view) it.duration = Toast.LENGTH_LONG it.setGravity(Gravity.START, 0, 0) it.setMargin(0.1f, 0.2f) } |
Кастомный (модифицированный) тост НЕ МОЖЕТ быть отображён когда приложение работает в фоне. Вместо него вы увидите сообщение: «Фоновый кастомный тост заблокирован для пакета [имя пакета] Смотрите g.co/dev/toast.».

В то же время обычный текстовый тост будет работать как и раньше:
1 |
val textToast = Toast.makeText(this, "Text toast", Toast.LENGTH_SHORT) |

2. Текстовые тосты больше нельзя изменять

До Android R оба вида тостов могли быть отредактированы (отступы, положение на экране). Но, начиная с новой версии системы, текстовые тосты больше могут изменять эти параметры. Эти функции для них будут нерабочими, т.е. их можно вызвать, но ничего не произойдёт.

При этом стоит отметить, что обычные тосты (созданы Toast(context: Context)) всё ещё могут быть отредактированы этими функциями.

3. Deprecated (устаревшая) функция — setView()

Отметим, что функцию всё так же можно использовать даже в Android 11. Но Deprecreated указывает, что функция будет удалена в будущих версиях системы. Разработчикам рекомендуют избегать подобных функций.
4. Новенький колбек — Toast.Callback
Новый колбек сообщает, когда тост был отображён, а когда скрыт. Добавить его тосту можно очень легко:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
val fooToast = Toast.makeText(this, "Simple toast message", Toast.LENGTH_SHORT) fooToast.addCallback(object: Toast.Callback() { override fun onToastShown() { super.onToastShown() // Do you own stuff } override fun onToastHidden() { super.onToastHidden() // Do you own stuff } }) fooToast.show() |
Summary
- Google пометил setView устаревшей, что подразумевает отсутствие в необходимости модифицировать тосты в будущем.
- Тосты можно разделить на два типа – «текстовые» и «простые»
- В Android R, модифицированные тосты не могут быть отображены, когда приложение находиться в фоне, а вместо этого будет отображён тост-предупреждение. Эти ограничения не действуют на текстовые тосты.
- Функции положения на экране и отступов текстового тоста больше ничего не делают.
- Новый колбек для тостов, который будет сообщать об отображении и скрытии тоста.