- Toast — всплывающие сообщения
- Вступление
- Теория
- Практика
- Константы для указания продолжительности показа сообщения
- Настройка позиции на экране
- Не забывайте про метод show()
- Пример
- Добавляем картинку
- Создание собственных всплывающих уведомлений
- Toast.Callback
- Использование уведомлений Toast в рабочих потоках
- Дополнительные сведения
- Заключение
- Дополнительные материалы
- Android Toast Messages не работают
- 8 ответов
- Не выводит Toast
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(), то строка будет подсвечена, а при подведении указателя мыши к строке увидите:
Kotlin
Java
Пример
Создайте новый проект или используйте любой старый проект из предыдущих занятий. Добавьте на экран активности кнопку и присвойте ей текст Показать Toast. Теперь напишем код:
Запустите приложение и нажмите кнопку. В центре экрана появится на короткое время текстовое сообщение, которое само исчезнет. Очень похоже на поведение чеширского кота.
Начиная с Android 4.4, внешний вид всплывающего сообщения изменился, раньше был прямоугольник без закруглений.
Для закрепления материала напишем ещё один пример. Удалим предыдущий код для щелчка кнопки и напишем такой код:
Я подумал, что вы можете не заметить сообщение, которое показывается слишком мало времени. Поэтому на этот раз я использовал константу LENGTH_LONG, чтобы вы успели обратить внимание на сообщение и покормить наконец несчастного голодного кота. Помимо этого, я поместил текст сообщения в XML-ресурсы, как это рекомендуется всегда делать. Кроме того, сообщение будет выводиться в верхней части экрана.
Добавляем картинку
Как правило, для Toast используются короткие текстовые сообщения. При необходимости вы можете добавить к сообщению и картинку. Используя метод setView(), принадлежащий объекту Toast, вы можете задать любое представление (включая разметку) для отображения.
Начнем с приготовлений. Подготовьте картинку и разместите её в папке res/drawable, как мы делали в уроке с «Hello Kitty». Картинка будет доступна приложению как ресурс через название файла без расширения. Например, я добавил в папку файл с изображением кота hungrycat.jpg и могу получить к нему доступ через выражение R.drawable.hungrycat. Чтобы изображение появилось в стандартном Toast-сообщении, нам потребуется программно создать объект класса ImageView и задать для него изображение из ресурсов с помощью метода setImageResource. Сам по себе стандартный внешний вид Toast состоит из контейнера LinearLayout, в который нужно добавить созданный объект ImageView. Можно задать также позицию, в которую следует вывести изображение. Если указать значение 0, то изображение будет показано выше текста. Код для создания 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().
Заключение
Сегодня вы научились выводить всплывающие сообщения на экран, а также получили образец кода, который вы обязаны вставлять в любое ваше приложение, чтобы пользователи никогда не забывали кормить своего питомца.
Дополнительные материалы
Пример частично цветного текста в Toast через Spannable
Источник
Android Toast Messages не работают
Я разрабатываю игру через Andengine для Android. У меня есть класс MainActivity и класс GameScene. Я использую Toast-сообщения в GameActivity. И это работает.
Итак, я хочу использовать Toast-сообщения в классе GameScene. Но не работает. Вот код:
Я должен использовать «активность» вместо «это». Но не работает
Когда я использую второй, возникает ошибка. LogCat: http://s29.postimg.org/k8faj9mdj/Capture.png
8 ответов
Вы пытаетесь отобразить Toast в фоновой цепочке. Вы должны выполнять все операции пользовательского интерфейса в основном потоке пользовательского интерфейса.
Исключение RuntimeException: Can’t create handler inside thread that has not called Looper.prepare() может быть немного загадочным для новичков, но по сути оно говорит вам, что вы попали в неправильную ветку.
Чтобы решить эту проблему, заверните тост, например, в runOnUiThread() :
Убедитесь, что в тестируемом приложении включены уведомления. Это была моя история, и почему тосты тоже не работали. Я искал прямой ответ, и так получилось, что тосты считаются частью уведомлений. Интересный материал, я понятия не имел.
Поскольку вы вызываете это из класса. вам нужно получить контекст из действия через конструктор класса, иначе вам нужно использовать GetApplicationcontext ().
Поскольку вы спросили, почему; Я думаю, вы даете ссылку на действие в качестве контекста для сообщения Toast, поэтому оно не работает.
Если вы пытаетесь показать тост-сообщение вне действия, вы можете попробовать:
Источник
Не выводит Toast
Цель — нужно выводить сообщение пользователю о НАЧАЛЕ индексирования.
Когда цикл отработает — выводить сообщение об окончании индексирования.
Цикл на моей 4-ядерной мобилке работает секунд 10, а сколько он будет отрабатывать на более слабых устройствах, вообще страшно подумать. И вот из-за длительности работы цикла — первое сообщение о старте не выводится. Выводит только сообщение о окончании.
Как это можно победить?
ps. Открою страшную тайну — под андроида и на Яве я пишу с января. Опыта на других языках — 25 лет. Так что — продвинутый новичек, так сказать
Toast.js
Приветствую. Столкнулся с такой проблемой: Есть страница, на ней n-количество полей для ввода. .
Toast trouble
Все Доброго времени суток! Начал учить андроид по книге, там приводился код для создания кастомного.
Toast duration
Подскажите как задать свое время Добавлено через 1 минуту только вот мне надо большое время.
1. использовать ProgressBar для отображения вместо тоста и AsynTask для индексирования (тем по асинк таскам полно на форуме)
2. не лучший вариант
ProgreeBar в данном случае не пойдет. Но все-равно сенкс.
Распишу поподробнее:
Я являюсь разработчиком (форк) jbak2 keyboard (выложена в маркет, если кому интересно).
Проект начал Юрий Бакунин и успешно его забросил в феврале 2013.
Я на нее нарвался случайно — версия в маркете — 0.97, на 4pda.ru версия (на основе которой написана и моя) — 0.97.7. Глючная — до невозможности. Я вообще не понимаю, КАК МОЖНО ТАК! угробить абсолютно рабочий проект (0.97 прекрасно работает). Но 0.97.7 предоставляет намного больше возможностей — например, благодаря ей смог прикрутить калькулятор, и размер вырос всего на десяток килобайт.
Все остальные клавиатуры, ВМЕСТЕ ВЗЯТЫЕ, что платные, что бесплатные, ей в подметки негодятся.
В-общем решил я её довести до ума.
Так как я не имею доступа к сайту словарей (для которых и нужно индексирование), то сделал кучу отдельных приложений (одно приложение = один словарь — это для старых телефонов у которых мало места), которые тупо копируют файл словаря (для конкретного языка) в определенную папку. Далее, при переключении на язык для которого установлен словарь — программа не обнаружив файл индекса — запускает индексацию. Но молча — не выводит никакого сообщения на экран. Но вводить символы при этом можно. Поэтому и прогрессбар не подходит. В данном случае — идеально бы подошел Toast или что нибудь подобное.
Источник