Как отключить тост уведомления на андроид
Перейти к содержимому

Как отключить тост уведомления на андроид

  • автор:

Как отключить тост сообщения в моем приложении?

Я строю игру Отелло (человеческая игра с ботом). В моей программе нет команды Toast и бесконечного цикла, моя игра просто занимает много времени для вычисления каждого следующего шага моего бота (я пытаюсь сделать своего бота более умным). По какой-то неясной причине система всегда показывает пустое сообщение в виде тоста и сообщение об ошибке в logcat, как показано ниже, и я не хочу видеть его появление. Как я могу отключить его или все тост сообщения?

введите описание изображения здесь

3 ответа

Выберите основной пакет в Android Studio, затем нажмите Ctrl+ Shift+ F, чтобы найти все ваши пакеты и классы, затем напишите «toast.show», чтобы найти тост, который написан в вашем коде.

У вас может быть сторонняя библиотека, которая создает тосты. Ты можешь использовать Find in path или же Find usages в Android Studio, чтобы найти, где отображаются тосты.

Что вы можете сделать, хотя и не найдете лучшего решения, так это вручную войти в настройки вашего устройства и заблокировать уведомления из вашего приложения, это заблокирует раздражающие тосты.

Вы также можете вызвать экран настроек уведомлений приложения с помощью кода (расширенного для поддержки всех версий Android) и, возможно, позже внедрить подпрограмму sharedprefs, чтобы показывать ее только впервые (чтобы не открывать настройки каждый раз, когда вы открываете приложение):

PS: Пожалуйста, проверьте этот ответ как правильный, если вы считаете, что было полезно ответить на ваш вопрос. TY

How to cancel Toast

I developed an android application and I am facing a problem with Toast . Suppose I am displaying a Toast, it is displayed on the application window. When a Dialog box is appears, the toast doesn’t disappear instantly .

I want to know how I can cancel the toast.

midhunhk's user avatar

8 Answers 8

Toast.makeText returns a Toast object. Call cancel() on this object to cancel it.

The shortest duration you can specify for the toast is Toast.LENGTH_SHORT which has a value of 0 but is actually 2000 milliseconds long . If you want it shorter than that, then try this:

Trikaldarshiii's user avatar

noypiscripter's user avatar

I think there is no need to create a custom toast.

Create only single instance of the Toast class. We just set the text of the toast using toast.setText(«string») , and call toast.cancel() method in onDestroy() method.

Working code snippet as follows:

Hope this helpful to you..

Swapnil Sonar's user avatar

Use cancel method of tost : toast.cancel();

Mahesh's user avatar

This is a basic example using the cancel() method of a Toast .

Jorgesys's user avatar

Dan Alboteanu's user avatar

First you have to create toast object

Then create method for Display message as Toast

Now Call below method when you have to cancel toast

Call below method when you have to display Toast

Ok, I too am trying to cancel a Toast, and can’t seem to get the cancel() call to get invoked in either the Activity.onDestroy() or the Activity.onStop(), etc. After some API-doc reading and googling of others needing help getting Toasts to get cancelled, I’m thinking I’m still not clear on when Activities get stopped, paused, destroyed. I need a sure-fire way to force my activity to get paused or stopped.

In my specific case, since there are only short and long duration Toasts, I decided to iterate a loop 5 times doing a show() of a long-duration toast, so it would stay on-screen for 15-20 seconds. That works fine!

But, the drawback (negative side-effect) of using a Toast object is that they persist even AFTER the user abandons your app and goes back to home-screen and starts using some other app. your toast is gonna live for the next 15-20 seconds, unless you can guarantee that you can find some place (some way) to invoke cancel(). Also, you must believe that Android will honor your call to cancel() !

So, to that end, I’ve been tweaking my simple loop, trying to invoke cancels right in the loop, and prove to myself it will honor a cancel call, and visually behave as expected.

Code snippet: Note: ‘toast’ is a public INSTANCE variable, so we have only ONE instance of the Toast-object [ as is recommended above, and which a commenter confirmed was working two years ago, in Activity onStop() and OnDestroy() ]

Ok, the original loop contained just that one line doing the show. That works, by itself.

But to experiment, I added those next four lines, to sleep for about half way thru the 3.5 second showing, then cancel it, sleep again for a second and a half, and then re-create and show the Toast again.

I expected to see the toast for approx 1.5 secs, then see it disappear, and come back on in another 1.5 secs, etc.

Guess what. the toast never appears AT ALL!

Ok, I’m in total mumble-mode. what am I missing, in understanding the inner-mysteries of how the Toast-class is implemented and is supposed to behave?

And, back to my first issue: How best to get my Activity to go into a paused or stopped state?

[ Note: I READ this forum a LOT. it’s great . This is my first posting into the middle of a thread-discussion. Sorry that my reply is getting flagged as an ANSWER, rather than as a QUESTION relating to this thread’s topic. ]

Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать

Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать

Ежедневно мы получаем десятки, если не сотни уведомлений от разных приложений.
Они могут требовать реакции с нашей стороны, а могут не требовать, но так или иначе их можно назвать интерактивными.
Узнать их очень просто.
Помимо кликабельности, они отличаются тем, что появляются в шторке уведомлений.
Однако есть и такие уведомления, которые материализуются в самом низу экрана, не позволяют кликнуть на себя и даже не уточняют, какое приложение их отправило. Разбираемся, что это такое.

Уведомления на Android бывают двух типов: обычные и тост

Второй тип уведомлений, упомянутых мной в предыдущем абзаце, называется тост-уведомлениями.
Несмотря на то что с английского слово toast переводится как поджаренный ломтик хлеба, на языке программистов этот термин обозначает маленькое информационное окно, присутствующее в некоторых видах программного обеспечения.

Что такое тост-уведомления

Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать

Это и есть тост-уведомление

Тост-уведомления — это системные уведомления, носящие исключительно информирующий характер и не требующие каких-либо действий от пользователя.
Самый известный пример тост-уведомлений — это уведомление о получении прав разработчика.
Как это сделать и, самое главное, зачем, мы рассказывали в отдельной статье — обязательно почитайте.

Поскольку тост-уведомления не позволяют кликнуть на них, зачастую пользователи, во-первых, не успевают прочесть их содержимое, а, во-вторых, не представляют, какое приложение их им направило.
В результате получается полная неразбериха, что не очень удобно, учитывая, что зачастую информационная ценность тост-уведомлений оказывается довольно высокой.

Как добавить тост-уведомления в шторку

Впрочем, существует приложение, которое позволяет превратить тост-уведомления в обычные с характерными признаками: кликабельностью, упоминанием принадлежности и отображением в шторке уведомлений.

  • Скачайте приложение Toast Sources из Google Play;
  • Запустите его и откройте доступ к универсальным возможностям;

Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать

Чтобы всё заработало, нужно дать приложению разрешение на работу с универсальным доступом

  • На главном экране включите параметры Service is enabled, Show as notifications и Display overlay;
  • Откройте шторку уведомления, как только следующее тост-уведомление поступит, и узнайте подробности.

Тост-уведомления на Android

Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать

На Android нельзя возвращаться к чтению тост-уведомлений, но с помощью Toast Sources — можно

Несмотря на то что скорее всего вы будете нечасто обращаться к Toast Sources, рекомендую после настройки тут же спрятать его в папку с другими ненужными приложениями.
Дело в том, что оно работает в пассивном режиме, автоматически выцепляя тост-уведомления из системы и интерпретируя их в обычные, которые затем размещаются в шторке уведомлений.
Поэтому просто рассматривайте его как одну из системных утилит, не претендующих на регулярное взаимодействие.

Не знаю, как часто вы получаете тост-уведомления, однако я фактически начал получать их только после установки Toast Sources.
Это выглядело странным, поэтому я прикинул мозгами и понял, что раньше я просто не замечал их, а теперь у меня банально нет шанса пропустить их.
Во всяком случае, когда они стали появляться в шторке уведомлений, я начал осознавать, что тост-уведомления не просто существуют, но и зачастую несут в себе очень полезную информацию.

Toast — всплывающие сообщения

Что такое тост? Представьте себе картину. За столом собралась большая куча народа и весело отмечает день рождения кота. Стоит шум и гам. Соседи громко разговаривают между собой и не обращают внимания на других. И тут из-за стола поднимается всеми уважаемый человек со стаканом вина и вилочкой стучит по стеклу стакана, чтобы привлечь внимание присутствующих. Шум смолкает и человек произносит тост. Также и в телефоне, когда вы увлечены какой-то задачей, вдруг всплывает сообщение, привлекая ваше внимание. Это и есть Toast. Второй пример — когда вы заряжаете специальный хлеб (тосты) в тостер, то они через определённое время подпрыгивают, сигнализируя о своей готовности. Посмотрим, как это работает в Android.

Теория

Всплывающее уведомление (Toast Notification) является сообщением, которое появляется на поверхности окна приложения, заполняя необходимое ему количество пространства, требуемого для сообщения. При этом текущая деятельность приложения остаётся работоспособной для пользователя. В течение нескольких секунд сообщение плавно закрывается. Всплывающее уведомление также может быть создано службой, работающей в фоновом режиме. Как правило, всплывающее уведомление используется для показа коротких текстовых сообщений.

Практика

Для создания всплывающего уведомления необходимо инициализировать объект Toast при помощи метода Toast.makeText(), а затем вызвать метод show() для отображения сообщения на экране:

Обычно пишут в одну строчку, соединяя вызов методов в цепочку .

У метода makeText() есть три параметра:

  • Контекст приложения
  • Текстовое сообщение
  • Продолжительность времени показа уведомления. Можно использовать только две константы

Константы для указания продолжительности показа сообщения

  • LENGTH_SHORT — (По умолчанию) показывает текстовое уведомление на короткий промежуток времени;
  • LENGTH_LONG — показывает текстовое уведомление в течение длительного периода времени.

Если покопаться в исходниках Android, то можно найти такие строчки:

Как видите, уведомления выводятся на 3 с половиной секунды или на 2 секунды. Других вариантов нет, не пытайтесь использовать другие значения — у вас ничего не получится.

Настройка позиции на экране

По умолчанию стандартное всплывающее уведомление появляется в нижней части экрана. Изменить место появления уведомления можно с помощью метода setGravity(int, int, int). Метод принимает три параметра:

  • стандартная константа для размещения объекта в пределах большего контейнера (например, GRAVITY.CENTER, GRAVITY.TOP и др.);
  • смещение по оси X
  • смещение по оси Y

Например, если вы хотите, чтобы уведомление появилось в центре экрана, то используйте следующий код (до вызова метода show()):

Для вывода в левом верхнем углу.

Если нужно сместить уведомление направо, то просто увеличьте значение второго параметра. Для смещения вниз нужно увеличить значение последнего параметра. Соответственно, для смещения вверх и влево используйте отрицательные значения.

Не забывайте про метод show()

Типичная ошибка начинающих программистов — забывают добавить вызов метода show() для отображения сообщения на экране. К счастью, в студии, если вы пропустите метод show(), то строка будет подсвечена, а при подведении указателя мыши к строке увидите:

Метод show()Kotlin Метод show()Java

Пример

Создайте новый проект или используйте любой старый проект из предыдущих занятий. Добавьте на экран активности кнопку и присвойте ей текст Показать Toast. Теперь напишем код:

Запустите приложение и нажмите кнопку. В центре экрана появится на короткое время текстовое сообщение, которое само исчезнет. Очень похоже на поведение чеширского кота.

Начиная с Android 4.4, внешний вид всплывающего сообщения изменился, раньше был прямоугольник без закруглений.

Toast

Для закрепления материала напишем ещё один пример. Удалим предыдущий код для щелчка кнопки и напишем такой код:

Я подумал, что вы можете не заметить сообщение, которое показывается слишком мало времени. Поэтому на этот раз я использовал константу LENGTH_LONG, чтобы вы успели обратить внимание на сообщение и покормить наконец несчастного голодного кота. Помимо этого, я поместил текст сообщения в XML-ресурсы, как это рекомендуется всегда делать. Кроме того, сообщение будет выводиться в верхней части экрана.

Добавляем картинку

Как правило, для Toast используются короткие текстовые сообщения. При необходимости вы можете добавить к сообщению и картинку. Используя метод setView(), принадлежащий объекту Toast, вы можете задать любое представление (включая разметку) для отображения.

Начнем с приготовлений. Подготовьте картинку и разместите её в папке res/drawable, как мы делали в уроке с «Hello Kitty». Картинка будет доступна приложению как ресурс через название файла без расширения. Например, я добавил в папку файл с изображением кота hungrycat.jpg и могу получить к нему доступ через выражение R.drawable.hungrycat. Чтобы изображение появилось в стандартном Toast-сообщении, нам потребуется программно создать объект класса ImageView и задать для него изображение из ресурсов с помощью метода setImageResource. Сам по себе стандартный внешний вид Toast состоит из контейнера LinearLayout, в который нужно добавить созданный объект ImageView. Можно задать также позицию, в которую следует вывести изображение. Если указать значение 0, то изображение будет показано выше текста. Код для создания Toast с изображением выглядит следующим образом:

Toast с картинкой

Вообще, получив доступ к контейнеру, вы можете делать с ним что угодно. Например, сделать его прозрачным. Смотрится интересно.

Создание собственных всплывающих уведомлений

В предыдущем примере мы получили доступ к контейнеру через метод getView(). Можно пойти от обратного — подготовить свой контейнер и внедрить его в объект Toast через метод setView().

Создадим собственный дизайн разметки для сообщения.

Вам нужно создать разметку в файле res/layout/custom_toast.xml.

Определите два дочерних элемента ImageView и TextView:

Для получения разметки из ХМL-файла и работы с ней в программе используется класс LayoutInflater и его метод getLayoutInflater(), которые возвращает объект LayoutInflater. Затем вызовом метода inflate() получают корневой объект View этой разметки. Например, для файла разметки уведомления с именем custom_toast.xml и его корневого элемента c идентификатором android:id=»@+id/custom_toast_container» код будет таким:

Параметры, передаваемые в метод inflate():

  • идентификатор ресурса макета (custom_toast.xml);
  • идентификатор ресурса корневого элемента (custom_toast_container).

После получения корневого элемента из него можно получить все дочерние элементы методом findViewByid() и определить информационное наполнение для этих элементов.

Затем создаётся объект Toast и устанавливаются нужные свойства, например, Gravity и продолжительность времени показа уведомления.

После этого вызывается свойство view() (Kotlin) или метод setView() (Java), которому передаётся разметка уведомления, и метод show(), чтобы отобразить уведомление с собственной разметкой.

Запустите проект на выполнение. При нажатии кнопки вызова должно появиться на несколько секунд окно уведомления с текстовым сообщением и значком.

Ради интереса можете посмотреть, как выглядит разметка в исходных кода Android.

Toast.Callback

В Android 11 R (API 30) добавили возможность отслеживания момента, когда сообщение появляется и скрывается при помощи Toast.Callback.

Ещё раз напомню, что метод setView() в Android 11 признан устаревшим. А также вообще рекомендуют не использовать собственные виды всплывающих сообщений, а ограничиться простыми текстовыми сообщениями. Иначе можно нарваться на системные ограничения.

Использование уведомлений Toast в рабочих потоках

Как элемент графического интерфейса Toast должен быть вызван в потоке GUI, иначе существует риск выброса межпотокового исключения. В листинге объект Handler используется для гарантии того, что уведомление Toast было вызвано в потоке GUI.

Дополнительные сведения

Напоследок хочу предупредить об одной потенциальной проблеме. При вызове сообщения нужно указывать контекст в первом параметре метода makeText(). В интернете и, возможно и у меня на сайте будет попадаться пример makeText(MainActivity.this, . ). Ошибки в этом нет, так как класс Activity является потомком Context и в большинстве случаев пример будет работать. Но иногда я получаю письма от пользователей, которые жалуются на непонятное поведение сообщения, когда текст не выравнивается, обрезается и т.д. Это связано с тем, что активность может использовать определённую тему или стиль, которые вызывают такой побочный эффект. Поэтому я рекомендую вам использовать метод getApplicationContext().

Второй момент — фрагменты, которые будете изучать позже, не являются потомками контекста. Если вы захотите вызвать всплывающее сообщение в фрагменте, то проблема может поставить вас в тупик. Вам нужно добавить новую переменную класса Activity через метод getActivity():

Такое же может случиться при вызове всплывающих сообщений из диалоговых окон, которые тоже не относятся к классу Context. Вместо getApplicationContext() также можно вызывать метод getBaseContext().

Заключение

Сегодня вы научились выводить всплывающие сообщения на экран, а также получили образец кода, который вы обязаны вставлять в любое ваше приложение, чтобы пользователи никогда не забывали кормить своего питомца.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *