1. Главная страница » Компьютеры

Android studio всплывающее сообщение

Автор: | 16.12.2019

Вступление

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

Теория

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

Читайте также:  Garage band приложение для айфона что это

Практика

Для создания всплывающего уведомления необходимо инициализировать объект 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(), то строка будет подсвечена, а при подведении указателя мыши к строке увидите:

Пример

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

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

В 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().

Если простого текстового сообщения недостаточно для уведомления пользователя приложения, можно создать собственный дизайн разметки своего уведомления. Для получения разметки из ХМL-файла и работы с ней в программе используется класс LayoutInflater и его методы getLayoutInflater() или getSystemService(), которые возвращают объект LayoutInflater. Затем вызовом метода inflate() получают корневой объект view этой разметки. Например, для файла разметки уведомления с именем custom_layout.xml и его корневого элемента c идентификатором andro код будет таким:

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

  • идентификатор ресурса схемы размещения (custom_layout.xml);
  • идентификатор ресурса корневого представления (toast_layout).

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

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

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

Вам нужно создать разметку custom_layout.xml.

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

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

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

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

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

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

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

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

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

Заключение

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

Дополнительное чтение

Пример частично цветного текста в Toast через Spannable

Разработчик Android приложения может «программно» создавать и открывать в интерфейсе окна всплывающие сообщения Toast. Объект Toast нельзя описа́ть в каком-либо файле в формате xml, Toast можно только сформировать в коде java. Приложение сохраняет свою работоспособность для пользователя при появления сообщения Toast. Как правило, всплывающее уведомление Toast используется для представления коротких текстовых сообщений. Например, при нажатии на кнопку формирования "Заказа" всплывает сообщение с текстом «Товар не выбран». Через пару секунд сообщение исчезает. Это и есть Toast сообщение.

Toast является View компонентом с коротким сообщением, появляющимся «поверх» интерфейса приложения. Объект Toast не может получить фокус.

Конструктор Toast

Конструктор класса Toast в качестве параметра получает контекст приложения :

Поскольку класс активности Activity является наследником Context, то его можно использовать в качестве параметра. Например, MainActivity.this.

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

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

Методы класса Toast

В следующем списке представлены часто используемые методы и константы класса Toast. C полным перечнем всех доступных (public) методов Вы можете познакомиться здесь.

  • static Toast makeText (Context context, int resId, int duration);
    статический метод создания всплывающего сообщения Toast;
  • void setDuration(int duration);
    определение продолжительности представления сообщения;
    можно использовать константы для определения продолжительности представления сообщения :
    LENGTH_SHORT = 2000 мс (по умолчанию);
    LENGTH_LONG = 3500 мс;
  • void setGravity(int gravity, int xOffset, int yOffset);
    позиционирование сообщения.
  • void setText(int resId);
    определение текста сообщения.
  • void setView(View view);
    определение View компонента для отображения во всплывающем сообщении.
  • void show();
    отображение всплывающего сообщения.

Пример использования Toast

Рассмотрим пример использования класса Toast для формирования различных типов сообщений :

  1. обычное сообщение Toast;
  2. сообщение Toast с позиционированием;
  3. сообщение Toast с изображением;
  4. сообщение Toast с View компонентом.

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

Листинг activity_main.xml

В следующем листинге описан интерфейс приложения, включающий четыре кнопки. К каждой кнопке подключен обработчик (метод Toast) в атрибуте «android:onClick». Интерфейс не локализован (атрибут «android:text»). В качестве шаблона интерфейса выбран LinearLayout.

Изображение для Toast

В контент двух типов сообщений Toast будем вставлять изображение пустой тележки (128×128). Загрузить изображение в директорию res/drawable модуля можно через буфер обмена с использованием горячих клавишей Ctrl+C, Ctrl+V.

Листинг toast.xml

Для четвертого типа сообщения Toast в примере необходимо описать интерфейс в ресурсном XML файле. Для этого создадим файл res/layout/toast.xml со следующим контентом. Интерфейс сообщения включает титульную строку (TextView), изображение пустой тележки (ImageView) и краткое сообщение (TextView).

Листинг метода Toast

В открытый (public) метод Toast в качестве пареметра передается View компонент нажатой кнопки. При нажатии на первую кнопку вызывается статический метод makeText класса Toast. Всплывающее сообщение будет представлено в нижней части экрана. При нажатии на вторую кнопку Toast сообщение позиционируется методом setGravity.

Особый интерес представляет обработчики нажатий на третью и четвертую кнопки. При нажатии на третью кнопку сначала создается и позиционируется Toast сообщение. После этого создается контейнер ImageView, в который загружается изображение, и далее в шаблон разметки Toast (LinearLayout) добавляется контейнер с изображением.

При формировании 4-го сообщения используется собственный настраиваемый (разработчиком) дизайн разметки уведомления, описанный в файле (toast.xml). Для чтения разметки из ХМL-файла используем класс LayoutInflater и один из его методов : getLayoutInflater() или getSystemService(), возвращающие объект типа LayoutInflater. Затем вызовом метода inflate() формируем объект View этой разметки, который передает Toast сообщению.

Старт примера

Запустите модуль на выполнение и понажимайте кнопки для просмотра всплывающих сообщений. Если Вы всё сделали правильно, то должны увидеть интерфейс своего приложения похожий на следующие скриншоты. На левом скриншоте представлено Toast сообщение, созданное при нажатии на 3-ю кнопку, на правом – сообщение, созданное при нажатии на 4-ю кнопку.

Программирование для платформы Андроид производится с применением одноименной интегрированной среды разработки (IDE) – Android Studio. Всплывающие сообщения (месседжи, окна) можно внедрять в код при помощи Android StudioToast – это специальный класс программного комплекса.

Чтобы создать заметное пользователю окно с полезной информацией разработчики IDE под Андроид придумали класс Android Studio Toast. В процессе работы программы человек получает заранее созданный месседж, например, о том, что нужно не забыть купить продукты к праздничному столу или вызвать мастера по ремонту стиральной машинки.

Два слова о теории

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

Как это выглядит на практике

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

Toast toast = Toast.makeText(getApplicationContext(),

«Срочно купить продукты!» , Toast.LENGTH_SHORT);

Метод makeText() имеет три значения:

  • контекст;
  • содержание месседжа;
  • количество времени показа окна.

Но программист способен изменять лишь два последних.

Указание времени показа сообщения

Изменяем длительность демонстрации окна – варианты:

  • LENGTH_SHORT — (значение установлено как дефолтное) – текст появляется на дисплее и задерживается совсем недолго. Это будет соответствовать коду: private static final int SHORT_DELAY = 2000
  • LENGTH_LONG — параметр для длительной демонстрации. Здесь получим: private static final int LONG_DELAY = 3500

Числовые значения 3500 и 2000 – это время в миллисекундах, то есть — 2 и 3,5 секунд. Другие длительности задать не удастся.

Как задать позицию на дисплее

Если ничего не менять, то окно с заданным текстом появится внизу дисплея. Задать иные свойства можно при использовании setGravity(int, int, int). Тут определяются 3 значения:

  • обычная постоянная для демонстрации объектов в рамка контейнера (пример: GRAVITY.CENTER или GRAVITY.TOP);
  • число, определяющее координату «X»;
  • значение «Y».

Пример: месседж должен возникнуть посередине дисплея:

toast.setGravity(Gravity.CENTER, 0, 0);

Координаты «Х» и «У» могут принимать числовые значения со знаками: плюс или минус – соответственно окно так же будет смещаться относительно центра.

Немного о методе show()

Обязательно добавлять в код вызов show() для отображения месседжа на дисплее. В противном случае редактор IDE обратит внимание на ошибку, подсвечивая соответствующую строку. Если разработчик подведёт курсор к ней, то увидит сообщение о том, что нужно добавить строку с show ().

Образец кода

Для тренировки можно сделать другой проект или же открыть имеющийся.

Шаг 1. Вводим новый элемент «Кнопка» на активный дисплей, присваиваем ему значение: «Показать Toast».

Шаг 2. Записываем:

public void showToast(View view) <

//здесь создадим текст с требуемым содержимым

Toast toast = Toast.makeText(getApplicationContext(),

"Срочно купить продукты!",

Toast.LENGTH_SHORT); // Это значит, что сообщение будет висеть минимум времени.

toast.setGravity(Gravity.CENTER, 0, 0); // Тут координаты – мессендж возникнет по центру.

toast.show(); // Обязательная строка вызова.

Шаг 3. Проверка: если запустить активный проект и кликнуть по кнопке, то на пару секунд появится окно с нашим текстом и пропадёт само собой.

Вставляем изображение

Метод setView() позволяет внедрить фото или другое изображение в наше окно.

Перемещаем нужную картинку в папку «res/drawable». Это будет новый доступный для IDE ресурс. Если имя рисунка pic.jpg, то в программном коде он станет доступным при написании: R.drawable.pic.

Вот весь код вызова Тоаст с нашей сохранённой картинкой:

public void showToast(View view) <

Toast toast3 = Toast.makeText(getApplicationContext(),

toast3.setGravity(Gravity.CENTER, 1, -1);

LinearLayout toastContainer = (LinearLayout) toast3.getView();

ImageView catImageView = new ImageView(getApplicationContext());

catImageView.setImageResource(R.drawable.pic); // Вызов нашего рисунка.

Теперь в Android Studio сообщение Toast при запуске отобразится с нашей сохранённой картинкой.

Программирование своих всплывающих сообщений

Допускается подготовка собственных контейнеров и внедрение их в объекты Toast посредством методов setView().

Иногда стандартного месседжа недостаточно для создания пользовательского приложения, тогда программист может применить особый дизайн разметки будущего окошка. Чтобы получить структурные данные из ХМL и работать с ними, в коде используют классы под названием «LayoutInflater» и их методы: getLayoutInflater() / getSystemService(), они способны вернуть LayoutInflater. Потом посредством инициации inflate() получаются блоки view.

Применение месседжей

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

Дополнительная информация

При программировании следует указывать информацию о контексте в параметре makeText(). Если возникают проблемы – странное поведение месседжа или текста внутри него – следует прибегать к методу getApplicationContext().

Благодаря указанным строкам кода можно с лёгкостью генерировать в Android Studio вывод сообщения для пользователя.

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

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