- Toast — всплывающие сообщения
- Вступление
- Теория
- Практика
- Константы для указания продолжительности показа сообщения
- Настройка позиции на экране
- Не забывайте про метод show()
- Пример
- Добавляем картинку
- Создание собственных всплывающих уведомлений
- Toast.Callback
- Использование уведомлений Toast в рабочих потоках
- Дополнительные сведения
- Заключение
- Дополнительные материалы
- CUSTOM TOAST VIEWS IN ANDROID
- Android Custom Toast with Examples
- Create a Custom Toast in Android
- Android Custom Toast Example
- activity_main.xml
- Custom_toast.xml
- MainActivity.java
- Output of Android Custom Toast Example
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
Источник
CUSTOM TOAST VIEWS IN ANDROID
May 5, 2019 · 4 min read
Have you come across custom Toasts that are different from your default Toast and you are wondering how they were made? Well, i am going to show you how, at least to an extent 😉
I’ll assume you already know how to make the default toast but if you don’t, there’s nothing to worry about because I’ll be discussing the default toast also.
A toast provides simple feedback abou t an operation in a small popup. It only fills the amount of space required for the message and the current activity remains visible and interactive. Toasts automatically disappear after a timeout.
Let’s get our hands dirty with writing some codes. In order to create a toast we first instantiate a toast object with one of the makeText() methods. This method takes three parameters: the application context, the text message, and the duration for the toast. It returns a properly initialized Toast object. You can display the toast notification with show() , as shown in the following example
The example above displays a toast with the message “Hello World!”.
You can also chain your methods and avoid holding on to the Toast object, like this:
Not OK with the position of your toast? Change it!
A standard toast notification appears near the bottom of the screen, centered horizontally. You can change this position with the setGravity(int, int, int) method. This method accepts three parameters: a Gravity constant, an x-position offset, and a y-position offset.
I’ll be giving you some options for the setGravity() method parameter and how they look like
Источник
Android Custom Toast with Examples
In android, Toast is a small popup notification that is used to display information about the operation which we performed in our app. The Toast will show the message for a small period of time and it will disappear automatically after a timeout.
Generally, the size of Toast will be adjusted based on the space required for the message and it will be displayed on the top of the main content of activity for a short period of time.
To know more about creation of Toast in android applications, check this Android Toast with Examples.
Generally, the Toast notification in android will be displayed with simple text like as shown in above image. In android, we can customize the layout of our toast notification to change the appearance of based on requirements like include images in toast notification or change the background color of toast notification, etc.
Following is the pictorial representation of using Custom Toast notification in android applications.
To customize the appearance of Toast notification, we need to create a custom layout in our XML or application code and pass the root View object to the setView(View) method.
Create a Custom Toast in Android
To create a custom Toast notification in android, we need to define a custom View layout in XML, for that create a custom XML file (custom_toast.xml) in layout (/layout) folder and write the code like as shown below.
xml version= «1.0» encoding= «utf-8» ?>
LinearLayout xmlns: android = «http://schemas.android.com/apk/res/android»
android :id= «@+id/custom_toast_container»
android :orientation= «horizontal»
android :layout_width= «match_parent»
android :layout_height= «match_parent»
android :paddingLeft= «10dp»
android :paddingRight= «10dp»
android :background= «#80CC28» >
ImageView android :src= «@drawable/ic_notification»
android :layout_width= «wrap_content»
android :layout_height= «wrap_content»
android :layout_marginRight= «10dp»/>
TextView android :id= «@+id/txtvw»
android :layout_width= «wrap_content»
android :layout_height= «wrap_content»
android :layout_marginTop= «13dp»
android :textColor= «#FFF»
android :textStyle= «bold»
android :textSize= «15dp»/>
LinearLayout >
To use this custom layout as Toast notification in our android application, we need to inflate the layout using following code.
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout. custom_toast , (ViewGroup) findViewById(R.id. custom_toast_layout ));
TextView tv = (TextView) layout.findViewById(R.id. txtvw );
tv.setText( «Custom Toast Notification» );
Toast toast = new Toast(getApplicationContext());
toast.setDuration(Toast. LENGTH_LONG );
toast.setView(layout);
toast.show();
If you observe above code, we created an instance of LayoutInflater with getLayoutInflater(), and then inflate our XML layout using inflate(int, ViewGroup). Here the first parameter is the layout resource ID and the second is the root View and this inflated layout will help us to find the View objects in the layout. After that we created a new Toast with Toast(Context) and set required properties of the toast, then we call setView(View) and pass it to the inflated layout.
Once we are done with required configurations, then we can show the custom toast notification by calling show() method.
Now we will see how to implement a custom Toast notification in android applications with examples.
Android Custom Toast Example
Create a new android application using android studio and give names as ToastExample. In case if you are not aware of creating an app in android studio check this article Android Hello World App.
Now open an activity_main.xml file from \res\layout path and write the code like as shown below.
activity_main.xml
xml version= «1.0» encoding= «utf-8» ?>
LinearLayout xmlns: android = «http://schemas.android.com/apk/res/android»
android :layout_width= «match_parent»
android :layout_height= «match_parent»
android :orientation= «vertical» >
Button
android :id= «@+id/btnShow»
android :layout_width= «wrap_content»
android :layout_height= «wrap_content»
android :text= «Show Custom Toast»
android :layout_marginTop= «150dp» android :layout_marginLeft= «110dp»/>
LinearLayout >
If you observe above code we created a one Button control in XML Layout file to show the custom toast notification when we click on Button.
Now we need to create a custom layout for our toast notification, for that create a new XML file (custom_toast.xml) in /layout folder and write the code like as shown below.
Custom_toast.xml
xml version= «1.0» encoding= «utf-8» ?>
LinearLayout xmlns: android = «http://schemas.android.com/apk/res/android»
android :id= «@+id/custom_toast_layout»
android :orientation= «horizontal»
android :layout_width= «match_parent»
android :layout_height= «match_parent»
android :paddingLeft= «10dp»
android :paddingRight= «10dp»
android :background= «#80CC28» >
ImageView android :src= «@drawable/ic_notification»
android :layout_width= «wrap_content»
android :layout_height= «wrap_content»
android :layout_marginRight= «10dp»/>
TextView android :id= «@+id/txtvw»
android :layout_width= «wrap_content»
android :layout_height= «wrap_content»
android :layout_marginTop= «13dp»
android :textColor= «#FFF»
android :textStyle= «bold»
android :textSize= «15dp»/>
LinearLayout >
If you observe above code we are loading image (ic_notification) from drawable folder so you need to add your icon in drawable folder to show it in notification.
Once we are done with the creation of layout with required controls, we need to load the XML layout resource from our activity onCreate() callback method, for that open main activity file MainActivity.java from \java\com.tutlane.toastexample path and write the code like as shown below.
MainActivity.java
package com.tutlane.customtoastexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity <
@Override
protected void onCreate(Bundle savedInstanceState) <
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
Button btn = (Button)findViewById(R.id. btnShow );
btn.setOnClickListener( new View.OnClickListener() <
@Override
public void onClick(View v) <
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout. custom_toast , (ViewGroup) findViewById(R.id. custom_toast_layout ));
TextView tv = (TextView) layout.findViewById(R.id. txtvw );
tv.setText( «Custom Toast Notification» );
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity. CENTER_VERTICAL , 0 , 100 );
toast.setDuration(Toast. LENGTH_LONG );
toast.setView(layout);
toast.show();
>
>);
>
>
If you observe above code we are calling our custom toast notification by using LayoutInflater object and showing a toast notification on Button click.
Generally, during the launch of our activity, the onCreate() callback method will be called by the android framework to get the required layout for an activity.
Output of Android Custom Toast Example
When we run above example using an android virtual device (AVD) we will get a result like as shown below.
If you observe above result we created a custom toast notification and showing it on Button click based on our requirements.
This is how we can create custom toast notifications in android applications based on our requirements.
Источник