- Toast — всплывающие сообщения
- Вступление
- Теория
- Практика
- Константы для указания продолжительности показа сообщения
- Настройка позиции на экране
- Не забывайте про метод show()
- Пример
- Добавляем картинку
- Создание собственных всплывающих уведомлений
- Toast.Callback
- Использование уведомлений Toast в рабочих потоках
- Дополнительные сведения
- Заключение
- Дополнительные материалы
- Может ли тост Android быть длиннее Toast.LENGTH_LONG?
- 25 ответов
- Похожие вопросы:
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.LENGTH_LONG?
При использовании setDuration() для тоста можно ли установить пользовательскую длину или, по крайней мере, что-то длиннее Toast.LENGTH_LONG ?
25 ответов
Я новичок в android, и я понимаю некоторые уже разработанные коды. Меня смущает Toast.LENGTH_LONG . Я искал его, и вот что я получил — тост похож на предупреждающее сообщение, которое исчезнет через некоторое время, но я не получаю его дальше ясно, так что, пожалуйста, кто-нибудь может мне помочь?
Я новичок в android. Я хочу показать тост в центре. Когда нет установленного сервиса Google Play, я хочу перенаправить его на сервис Google Play и отобразить тост. @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState);.
Если покопаться поглубже в коде android, то можно найти строки, которые четко указывают на то, что мы не можем изменить продолжительность тостового сообщения.
и значения по умолчанию для продолжительности
Значения LENGTH_SHORT и LENGTH_LONG равны 0 и 1. Это означает, что они рассматриваются как флаги, а не фактические длительности, поэтому я не думаю, что можно будет установить длительность на что-либо другое, кроме этих значений.
Если вы хотите, чтобы сообщение отображалось пользователю дольше, рассмотрите уведомление в строке состояния . Уведомления в строке состояния могут быть программно отменены, когда они больше не актуальны.
Вы можете попробовать:
чтобы удвоить время. Если вы укажете 3 вместо 2, то это утроит time..etc.
Я использую тост на android, однако я не хочу, чтобы тост исчез. но лучше останься. И я не хочу, чтобы тост появлялся на другом действии или фрагменте. Если я вызвал тост в определенном фрагменте, я не хочу, чтобы он был виден в другом фрагменте или действии. Допустим, действие 1, я звоню.
В android тост по умолчанию находится в нижней части экрана. Toast.makeText(getApplicationContext(), this is my Toast message. =),Toast.LENGTH_LONG).show(); Как я могу поместить тост в центр экрана?
Если вы хотите, чтобы Toast сохранялся, я обнаружил, что вы можете взломать свой путь вокруг него, имея Timer вызова toast.show() несколько раз (каждая секунда или около того должно делать). Вызов show() ничего не нарушает, если Toast уже отображается, но он обновляет количество времени, которое он остается на экране.
Я разработал пользовательский класс тостов, с помощью которого вы можете показывать тосты в течение желаемого периода времени (в миллисекундах)
Вот как вы будете отображать тост в течение 5 секунд (или 5000 миллисекунд):
Я знаю, что немного опоздал, но я взял ответ Regis_AG и завернул его в вспомогательный класс, и он отлично работает.
В коде вашего приложения просто сделайте что-то вроде этого:
Я знаю, что ответ довольно поздний .. у меня была та же самая проблема , и я решил реализовать свою собственную версию Bare bones Toast, изучив исходный код android для toast .
В основном вам нужно создать новый оконный менеджер , а также показать и скрыть окно на желаемую продолжительность длительности с помощью обработчика
После инициализации макета вы можете использовать свои собственные методы скрытия и отображения
Теперь все, что вам нужно, это добавить два запущенных потока, которые вызывают handleShow() и handleHide(), которые вы можете отправить в обработчик.
и заключительная часть
Это была быстрая и грязная реализация . не принимавшая во внимание никакой производительности .
LONG_DELAY тост дисплей для 3.5 сек и тосты дисплей SHORT_DELAY за 2 сек .
Тост внутренне использует INotificationManager и вызывает его метод enqueueToast каждый раз, когда вызывается Toast.show().
Вызов show() с SHORT_DELAY дважды поставит в очередь один и тот же тост снова. он будет отображаться в течение 4 секунд (2 секунды + 2 секунды).
точно так же вызов show() с помощью LONG_DELAY дважды поставит в очередь один и тот же тост снова. он будет отображаться в течение 7 секунд ( 3.5 секунды + 3.5 секунды)
Вот пользовательский класс тостов, который я сделал, используя приведенный выше код:
Если вам нужен длинный тост, есть практическая альтернатива, но она требует, чтобы ваш пользователь нажал на кнопку OK, чтобы она исчезла. Вы можете использовать AlertDialog вот так:
Если у вас длинное сообщение, скорее всего, вы не знаете, сколько времени потребуется вашему пользователю, чтобы прочитать его, поэтому иногда полезно потребовать, чтобы ваш пользователь нажал на кнопку OK, чтобы продолжить. В моем случае я использую эту технику, когда пользователь нажимает на значок справки.
Как уже упоминалось другими, Android тосты могут быть либо LENGTH_LONG, либо LENGTH_SHORT. Нет никакого способа обойти это, и вы не должны следовать ни одному из ‘hacks’ опубликованных.
Цель тостов-показать информацию «non-essential», и из-за их затяжного эффекта сообщения могут быть далеко вырваны из контекста, если их продолжительность превышает определенный порог. Если бы стандартные тосты были изменены таким образом, чтобы они могли отображаться дольше, чем LENGTH_LONG, сообщение задерживалось бы на экране до тех пор, пока процесс приложения не будет завершен, поскольку тостовые представления добавляются к WindowManager, а не к ViewGroup в вашем приложении. Я бы предположил, что именно поэтому он жестко закодирован.
Если вам абсолютно необходимо показать сообщение в стиле тоста дольше трех с половиной секунд, я рекомендую создать представление, которое будет прикреплено к содержимому действия, чтобы оно исчезло, когда пользователь выйдет из приложения. Моя библиотека SuperToasts занимается этим вопросом и многими другими, не стесняйтесь использовать ее! Скорее всего, вам будет интересно использовать SuperActivityToasts
Просто используйте SuperToast , чтобы сделать элегантный тост в любой ситуации. Сделайте свой тост красочным . Измените цвет шрифта , а также его размер . Надеюсь, это будет все в одном для вас.
Закусочная > Тосты, Пользовательские Тосты, Гренки
Вот очень простой метод, который сработал для меня:
Длительность LENGTH_SHORT составляет 2 секунды, а LENGTH_LONG-3.5 секунд, здесь тост-сообщение будет отображаться в течение 6 секунд , так как оно заключено в for loop. Но недостатком этого метода является то, что через каждые 2 секунды может возникнуть небольшой эффект замирания. но это не очень заметно. Надеюсь, это будет полезно
Пользователь не может самостоятельно определить продолжительность тоста. потому что функция NotificationManagerService scheduleTimeoutLocked() не использует длительность поля. исходный код выглядит следующим образом.
Используйте Crouton, это очень гибкая библиотека тостов.
Вы можете использовать его так же, как тосты:
или вы даже можете пойти немного глубже и настроить его больше, например, установить время на бесконечность! например, здесь я хочу показать тост-сообщение до тех пор, пока пользователь не подтвердит его, нажав на него.
Макет Custome, который будет раздут для тоста.
Продолжительность тоста может быть взломана с помощью потока, который запускает тост исключительно. Это работает (запускает тост в течение 10 секунд, изменяет sleep и ctr по своему вкусу):
Тост с пользовательским фоном и видом сделал свое дело для меня. Я протестировал его на планшете nexus 7 и не заметил никакой анимации fadeIn fadeout во время цикла. Вот реализация:
Вот пользовательский textview, используемый в приведенном выше коде:
@drawable/fragment_background делает мой тост закругленным углом, как в версии kitkat. Вы также можете добавить в файл другие представления. Любые изменения для улучшения и комментарии приветствуются, так как я планирую реализовать это в своем Живом приложении.
Этот текст исчезнет через 5 секунд.
Редактировать: Как сказал Итай Спектор в комментарии, он будет показан примерно через 3.5 секунд, поэтому используйте этот код:
Запланируйте обратный отсчет до определенного времени в будущем, с регулярными уведомлениями о интервалах на этом пути. Пример отображения 30-секундного обратного отсчета в текстовом поле:
Нет, и большинство/все хаки, перечисленные здесь, больше не работают в android 9. Но есть гораздо лучшее решение: если ваше сообщение должно висеть рядом, используйте диалоговое окно.
Очень простой подход к созданию немного более длинного сообщения заключается в следующем:
Обратите внимание, что приведенный выше пример исключает опцию LENGTH_SHORT, чтобы сохранить пример простым.
Как правило, вы не хотите использовать Тостовое сообщение для отображения сообщений в течение очень длительных интервалов, так как это не является целью класса тостов. Но бывают случаи, когда объем текста, который вам нужно отобразить, может занять у пользователя больше, чем 3.5 секунд, чтобы прочитать, и в этом случае небольшое увеличение времени (например, до 6.5 секунд, как показано выше) может, IMO, быть полезным и соответствовать предполагаемому использованию.
Устанавливает тост на определенный период в миллисекундах:
После неудачи с каждым доступным решением я, наконец, нашел обходной путь с помощью рекурсии.
Код:
Похожие вопросы:
Возможный Дубликат : Может ли тост Android быть длиннее “Toast.LENGTH_LONG”? Есть ли способ сделать так, чтобы тостовые сообщения длились дольше, чем Toast.LENGTH_LONG? Я не чувствую.
Возможный Дубликат : Может ли тост Android быть длиннее “Toast.LENGTH_LONG”? Можно ли сделать тост с пользовательской длительностью (8 или 26 секунд)? Я читал вопросы, задающие длину.
У меня есть приложение, которое использует Toast, и я протестировал его на Samsung Galaxy II с использованием Android 4.3, и оно работает нормально. Недавно я получил Nexus 5 под управлением Android.
Я новичок в android, и я понимаю некоторые уже разработанные коды. Меня смущает Toast.LENGTH_LONG . Я искал его, и вот что я получил — тост похож на предупреждающее сообщение, которое исчезнет через.
Я новичок в android. Я хочу показать тост в центре. Когда нет установленного сервиса Google Play, я хочу перенаправить его на сервис Google Play и отобразить тост. @Override protected void.
Я использую тост на android, однако я не хочу, чтобы тост исчез. но лучше останься. И я не хочу, чтобы тост появлялся на другом действии или фрагменте. Если я вызвал тост в определенном фрагменте.
В android тост по умолчанию находится в нижней части экрана. Toast.makeText(getApplicationContext(), this is my Toast message. =),Toast.LENGTH_LONG).show(); Как я могу поместить тост в центр.
Поскольку вы должны включить юридическое уведомление при использовании google maps на android, я добавил следующий код в свой фрагмент: //in oncreate view method _noticeMaps.setOnClickListener(new.
Есть ли способ показать Тостовое сообщение в течение 30 секунд (без эффекта мигания)? Я уже пробовал эти методы на этом посту, однако ни один из них не работает для меня (Android 9) Может ли тост.
Я блокирую его на несколько часов, есть ли шанс произнести тост перед выполнением намерения? В этом коде тост появляется только после выполнения. @Override public void onNewIntent(Intent intent) <.
Источник