Как изменить положение тоста в Android?

279

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

Теперь я хочу отобразить его в середине экрана или где-то по своему выбору.

Кто-нибудь может подсказать мне, как этого добиться?

UMAR
источник

Ответы:

410

Из документации ,

Расположение вашего тоста

Стандартное уведомление о тостах появляется в нижней части экрана по центру по горизонтали. Вы можете изменить эту позицию с помощью setGravity(int, int, int)метода. Это принимает три параметра: Gravityконстанта, x-positionсмещение и y-positionсмещение.

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

toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

Если вы хотите сместить позицию вправо, увеличьте значение второго параметра. Чтобы уменьшить его, увеличьте значение последнего параметра.

Pentium10
источник
11
Какие целочисленные значения там? Они dpi? или что такое макс?
Клифгрей
9
Может быть, указывает на очевидное, но Gravity.CENTER_VERTICALпоставит тост в середине экрана.
Феликс
3
Смещение по x и y указано в пикселях, поэтому максимальная ширина / высота вашего дисплея.
Bluewhile
2
@ Pentium10 В документе указано, что смещения указаны в пикселях. Должен ли я считать, что это единицы «px», а не «dp»?
батбрат
Мои тостовые сообщения на моем новом galaxy s6 показывают в 2 разных положениях. сначала в левой горизонтальной центральной вертикали, а затем перемещается вниз к центральной горизонтали, нижней вертикали. этот эффект не происходит ни на одном из моих старых тестовых устройств. Я отображаю каждое сообщение дважды в строке, так как любое
нажатие на
150

Если вы получите сообщение об ошибке, указывающее на необходимость вызова makeText, это исправит следующий код:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
Rymnel
источник
1
makeText возвращает объект Toast, так что вы можете просто добавить .addGravity и .show после makeText.
NikkyD
1
«если вы получите ошибку, указывающую, что вы должны вызвать makeText» - когда эта ошибка появится?
Яцек Ласковски
1
Ошибка происходит, если вы используете конструктор, new Toast(context)а неToast.makeText(...)
bluewhile
16

Вы можете настроить местоположение вашего тоста, используя:

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();       
}
JDJ
источник
2
В этом ответе stackoverflow.com/a/21026866/630833 учитывается размер тоста, который был мне полезен.
Jayeffkay
Это отличный пример. Спасибо.
wonsuc
11
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
nzala
источник
7
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

user3652986
источник
3

Метод для изменения цвета, положения и цвета фона тоста:

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

Митхун Адхикари
источник
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
greg-449
2

установка тоста на экране 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();  

так же, как мы можем установить тост слева, справа и в центре

Нажмите здесь

Абхишек
источник
0

// Пользовательский класс тостов, где вы можете показывать пользовательский тост или тост по умолчанию

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();
            }

        }
Amardeep
источник