Android
Тост
Поиск…
Вступление
Тост обеспечивает простую обратную связь о операции в небольшом всплывающем окне и автоматически исчезает после таймаута. Он заполняет объем пространства, необходимый для сообщения, и текущая активность остается видимой и интерактивной.
Синтаксис
- Toast makeText (контекст контекста, текст CharSequence, int duration)
- Toast makeText (контекст контекста, int resId, int duration)
- void setGravity (int gravity, int xOffset, int yOffset)
- void show ()
параметры
параметр | подробности |
---|---|
контекст | Контекст для отображения вашего Toast in. this обычно используется в Activity, а getActivity() обычно используется в фрагменте |
текст | CharSequence, который указывает, какой текст будет показан в Toast. Любой объект, реализующий CharSequence, может использоваться, включая String |
RESID | Идентификатор ресурса, который может использоваться для предоставления ресурса Строка для отображения в Toast |
продолжительность | Целочисленный флаг, показывающий, как долго будет отображаться тост. Параметры: Toast.LENGTH_SHORT и Toast.LENGTH_LONG |
сила тяжести | Целое число, определяющее позицию или «гравитацию» Тоста. См. Параметры здесь |
xOffset | Задает горизонтальное смещение для позиции Toast |
YOffset | Определяет вертикальное смещение для позиции Toast |
замечания
Тост обеспечивает простую обратную связь об операции в небольшом всплывающем окне. Он заполняет объем пространства, необходимый для сообщения, и текущая активность остается видимой и интерактивной.
Более поздняя альтернатива Toast - SnackBar. SnackBar предлагает обновленный визуальный стиль и позволяет пользователю отклонить сообщение или предпринять дальнейшие действия. Подробности см. В документации SnackBar .
Официальная документация:
https://developer.android.com/reference/android/widget/Toast.html
Установить положение тоста
Стандартное уведомление тоста появляется в нижней части экрана, выровненного в горизонтальном центре. Вы можете изменить эту позицию с помощью setGravity(int, int, int)
. Он принимает три параметра: константу силы тяжести, смещение по оси x и смещение позиции y.
Например, если вы решите, что тост должен появиться в верхнем левом углу, вы можете установить гравитацию следующим образом:
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
Отображение сообщения о Toast
В Android, Toast - это простой элемент пользовательского интерфейса, который может использоваться для предоставления контекстной обратной связи пользователю.
Чтобы отобразить простое сообщение Toast, мы можем сделать следующее.
// Declare the parameters to use for the Toast
Context context = getApplicationContext();
// in an Activity, you may also use "this"
// in a fragment, you can use getActivity()
CharSequence message = "I'm an Android Toast!";
int duration = Toast.LENGTH_LONG; // Toast.LENGTH_SHORT is the other option
// Create the Toast object, and show it!
Toast myToast = Toast.makeText(context, message, duration);
myToast.show();
Или, чтобы показать Toast inline, не удерживая объект Toast, вы можете:
Toast.makeText(context, "Ding! Your Toast is ready.", Toast.LENGTH_SHORT).show();
ВАЖНО: Убедитесь, что метод show()
вызывается из потока пользовательского интерфейса. Если вы пытаетесь показать Toast
из другого потока, вы можете, например, использовать метод runOnUiThread
для Activity
.
В противном случае, имея в виду попытку изменить пользовательский интерфейс, создав Toast, вы получите RuntimeException
которое будет выглядеть следующим образом:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Самый простой способ обработки этого исключения - просто использовать runOnUiThread: синтаксис показан ниже.
runOnUiThread(new Runnable() {
@Override
public void run() {
// Your code here
}
});
Создание пользовательского тоста
Если вы не хотите использовать представление Toast по умолчанию, вы можете предоставить свой собственный, используя метод setView(View)
на объекте Toast
.
Во-первых, создайте XML-макет, который вы хотели бы использовать в своем Toast.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout_root"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:background="#111">
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"/>
<TextView android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"/>
</LinearLayout>
Затем, создавая свой тост, надуйте свой собственный вид из XML и вызовите setView
// Inflate the custom view from XML
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast_layout,
(ViewGroup) findViewById(R.id.toast_layout_root));
// Set the title and description TextViews from our custom layout
TextView title = (TextView) layout.findViewById(R.id.title);
title.setText("Toast Title");
TextView description = (TextView) layout.findViewById(R.id.description);
description.setText("Toast Description");
// Create and show the Toast object
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Реальный безопасный способ отображения Toast (Application Wide)
public class MainApplication extends Application {
private static Context context; //application context
private Handler mainThreadHandler;
private Toast toast;
public Handler getMainThreadHandler() {
if (mainThreadHandler == null) {
mainThreadHandler = new Handler(Looper.getMainLooper());
}
return mainThreadHandler;
}
@Override public void onCreate() {
super.onCreate();
context = this;
}
public static MainApplication getApp(){
return (MainApplication) context;
}
/**
* Thread safe way of displaying toast.
* @param message
* @param duration
*/
public void showToast(final String message, final int duration) {
getMainThreadHandler().post(new Runnable() {
@Override
public void run() {
if (!TextUtils.isEmpty(message)) {
if (toast != null) {
toast.cancel(); //dismiss current toast if visible
toast.setText(message);
} else {
toast = Toast.makeText(App.this, message, duration);
}
toast.show();
}
}
});
}
Не забудьте добавить MainApplication
в manifest
.
Теперь вызовите его из любого потока, чтобы отобразить тост-сообщение.
MainApplication.getApp().showToast("Some message", Toast.LENGTH_LONG);
Показать сообщение с тостами над мягкой клавиатурой
По умолчанию Android отображает сообщения Toast в нижней части экрана, даже если клавиатура отображается. Это покажет сообщение Toast чуть выше клавиатуры.
public void showMessage(final String message, final int length) {
View root = findViewById(android.R.id.content);
Toast toast = Toast.makeText(this, message, length);
int yOffset = Math.max(0, root.getHeight() - toast.getYOffset());
toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, yOffset);
toast.show();
}
Thread безопасный способ отображения сообщения Toast (для AsyncTask)
Если вы не хотите распространять приложение и поддерживать потоки сообщений в потоковом режиме, убедитесь, что вы показываете их в разделе после выполнения своих задач AsyncTasks.
public class MyAsyncTask extends AsyncTask <Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Do your background work here
}
@Override
protected void onPostExecute(Void aVoid) {
// Show toast messages here
Toast.makeText(context, "Ding! Your Toast is ready.", Toast.LENGTH_SHORT).show();
}
}