Android toast - спливаючі повідомлення

вступ
Спливаюче повідомлення (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 (). то рядок буде підсвічена, а при підведенні покажчика миші до рядка побачите:
Створіть новий проект або використовуйте будь-який старий проект з попередніх занять. Додайте на екран активності кнопку і надайте їй текст Показати 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 ідентифікатором android: id = "@ + id / toast_layout" код буде таким:
Параметри, що передаються в метод inflate ():
- ідентифікатор ресурсу схеми розміщення (custom_layout.xml);
- ідентифікатор ресурсу кореневого уявлення (toast_layout).
Після отримання кореневого уявлення з нього можна отримати всі дочірні уявлення вже відомим методом findViewByid () і визначити інформаційне наповнення для цих елементів.
Потім створюється об'єкт Toast і встановлюються потрібні властивості, наприклад, Gravity і тривалість часу показу повідомлення.
Після цього викликається метод setView (). якому передається розмітка повідомлення, і метод show (). щоб відобразити повідомлення з власної розміткою:
Вам потрібно створити розмітку custom_layout.xml.
Визначте два дочірніх елемента ImageView і TextView:
Запустіть проект на виконання. При натисканні кнопки виклику повинно з'явитися на кілька секунд вікно повідомлення з текстовим повідомленням і значком.
Використання повідомлень Toast в робочих потоках
Як елемент графічного інтерфейсу Toast повинен бути викликаний в потоці GUI, інакше існує ризик викиду межпотокового виключення. У лістингу об'єкт Handler використовується для гарантії того, що повідомлення Toast було викликано в потоці GUI.
додаткові відомості
Наостанок хочу попередити про одну потенційну проблему. Коли Ви телефонуєте повідомлення потрібно вказувати контекст в першому параметрі методу makeText (). В інтернеті та, можливо і у мене на сайті буде потрапляти приклад makeText (MainActivity.this.). Помилки в цьому немає, так як клас Activity є нащадком Context і в більшості випадків приклад буде працювати. Але іноді я отримую листи від користувачів, які скаржаться на незрозуміла поведінка повідомлення, коли текст не вирівнюється, обрізається і т.д. Це пов'язано з тим, що активність може використовувати певні форуми чи стиль, які викликають такий побічний ефект. Тому я рекомендую вам використовувати метод getApplicationContext ().
Другий момент - фрагменти, які будете вивчати пізніше, не є нащадками контексту. Якщо ви захочете відкрити спливаючий повідомлення в фрагменті, то проблема може поставити вас в глухий кут. Вам потрібно додати нову змінну класу Activity через метод getActivity ():
Таке ж може статися при виклику спливаючих повідомлень з діалогових вікон, які теж не відносяться до класу Context. Замість getApplicationContext () також можна викликати метод getBaseContext ().
висновок
Сьогодні ви навчилися виводити спливаючі повідомлення на екран, а також отримали зразок коду, який ви зобов'язані вставляти в будь-який ваш додаток, щоб користувачі ніколи не забували годувати свого вихованця.