Android studio не работает 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(), то строка будет подсвечена, а при подведении указателя мыши к строке увидите:

Читайте также:  Android смартфон за 6000

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 и продолжительность времени показа уведомления.

Читайте также:  Apple filing protocol android

После этого вызывается свойство 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() :

Читайте также:  Zygote android что это

Убедитесь, что в тестируемом приложении включены уведомления. Это была моя история, и почему тосты тоже не работали. Я искал прямой ответ, и так получилось, что тосты считаются частью уведомлений. Интересный материал, я понятия не имел.

Поскольку вы вызываете это из класса. вам нужно получить контекст из действия через конструктор класса, иначе вам нужно использовать 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 или что нибудь подобное.

Источник

Оцените статью