Как изменить положение тоста в Android?
Когда я использую Toast
чтобы отобразить всплывающий текст на экране, он отображает текст немного выше нижней части экрана, который является положением по умолчанию.
Теперь я хочу отобразить его в середине экрана или где-то по своему выбору.
Кто-нибудь может подсказать мне, как этого добиться?
13 ответов
Из документации,
Расположение вашего тоста
Стандартное уведомление о тостах появляется в нижней части экрана по центру по горизонтали. Вы можете изменить эту позицию с помощью
setGravity(int, int, int)
метод. Это принимает три параметра:Gravity
постояннаяx-position
смещение иy-position
смещение.Например, если вы решите, что тост должен появиться в верхнем левом углу, вы можете установить гравитацию следующим образом:
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
Если вы хотите сместить позицию вправо, увеличьте значение второго параметра. Чтобы уменьшить его, увеличьте значение последнего параметра.
Кроме того, если вы получаете сообщение об ошибке, указывающее на необходимость вызова makeText, следующий код заставляет его работать:
Toast toast= Toast.makeText(getApplicationContext(),
"Your string here", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
Из документации:
Предупреждение. Начиная с Android Build.VERSION_CODES#R, для приложений, ориентированных на уровень API Build.VERSION_CODES#R или выше, этот метод (setGravity) не работает при вызове текстовых всплывающих сообщений.
Что обозначает
setGravity
больше не может использоваться в API 30+, и для достижения требуемого поведения необходимо будет найти другой.
Вы можете настроить местоположение вашего тоста, используя:
setGravity(int gravity, int xOffset, int yOffset)
Это позволяет вам очень точно указать, где вы хотите разместить тост.
Одна из наиболее полезных особенностей параметров xOffset и yOffset заключается в том, что вы можете использовать их для размещения тоста относительно определенного представления.
Например, если вы хотите создать собственный тост, который появляется поверх кнопки, вы можете создать такую функцию:
// v is the Button view that you want the Toast to appear above
// and messageId is the id of your string resource for the message
private void displayToastAboveButton(View v, int messageId)
{
int xOffset = 0;
int yOffset = 0;
Rect gvr = new Rect();
View parent = (View) v.getParent();
int parentHeight = parent.getHeight();
if (v.getGlobalVisibleRect(gvr))
{
View root = v.getRootView();
int halfWidth = root.getRight() / 2;
int halfHeight = root.getBottom() / 2;
int parentCenterX = ((gvr.right - gvr.left) / 2) + gvr.left;
int parentCenterY = ((gvr.bottom - gvr.top) / 2) + gvr.top;
if (parentCenterY <= halfHeight)
{
yOffset = -(halfHeight - parentCenterY) - parentHeight;
}
else
{
yOffset = (parentCenterY - halfHeight) - parentHeight;
}
if (parentCenterX < halfWidth)
{
xOffset = -(halfWidth - parentCenterX);
}
if (parentCenterX >= halfWidth)
{
xOffset = parentCenterX - halfWidth;
}
}
Toast toast = Toast.makeText(getActivity(), messageId, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, xOffset, yOffset);
toast.show();
}
Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
Toast mytoast= Toast.makeText(getApplicationContext(), "Toast Message", 1);
mytoast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0); // for center horizontal
//mytoast.setGravity(Gravity.CENTER_VERTICAL); // for center vertical
//mytoast.setGravity(Gravity.TOP); // for top
mytoast.show();
Приведенный выше код поможет вам отобразить тост в центре экрана или по вашему выбору, для этого просто установите гравитацию тоста в соответствии с вашими потребностями
Примечание: для этого процесса вы должны использовать объект Toast
Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
//это лучшее решение для противодействия любой ошибке
РЕШЕНИЕ
fun Context.showToastOnTOP(message: String) = Toast.makeText(this, message, Toast.LENGTH_SHORT)
.apply { setGravity(Gravity.TOP, 0, 0); show() }
fun Context.showToastOnBOTTOM(message: String) = Toast.makeText(this, message, Toast.LENGTH_SHORT)
.apply { setGravity(Gravity.BOTTOM, 0, 0); show() }
Важная заметка
Gravity
будет работать только в том случае, если ваше приложение нацелено на максимум 29 или меньше.
Таблетка от холода :)
Метод для изменения цвета, положения и цвета фона тоста:
Toast toast=Toast.makeText(getApplicationContext(),"This is advanced toast",Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0);
View view=toast.getView();
TextView view1=(TextView)view.findViewById(android.R.id.message);
view1.setTextColor(Color.YELLOW);
view.setBackgroundResource(R.color.colorPrimary);
toast.show();
Для построчного объяснения: https://www.youtube.com/watch?v=5bzhGd1HZOc
Для таких же, как я, ищущих ответ, как установить гравитацию в Toasts на Android R и выше, смотрите эту статью .
// Пользовательский класс тостов, где вы можете показывать пользовательский тост или тост по умолчанию
public class ToastMessage {
private Context context;
private static ToastMessage instance;
/**
* @param context
*/
private ToastMessage(Context context) {
this.context = context;
}
/**
* @param context
* @return
*/
public synchronized static ToastMessage getInstance(Context context) {
if (instance == null) {
instance = new ToastMessage(context);
}
return instance;
}
/**
* @param message
*/
public void showLongMessage(String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
/**
* @param message
*/
public void showSmallMessage(String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
/**
* The Toast displayed via this method will display it for short period of time
*
* @param message
*/
public void showLongCustomToast(String message) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
msgTv.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
}
/**
* The toast displayed by this class will display it for long period of time
*
* @param message
*/
public void showSmallCustomToast(String message) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
msgTv.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
}
}
Установка тоста на экране topin
toast.setView(view);
toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
сейчас внизу
toast.setView(view);
toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
так же, как мы можем установить тост слева, справа и в центре
Нажмите здесь
Toast toast = Toast.makeText(this, "Custom toast creation", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0);
toast.show();