Як змінити позицію Toast в Android?


279

Коли я використовую Toastдля відображення деякого спливаючого тексту на екрані, він відображає текст трохи вище нижньої частини екрана, що є позицією за замовчуванням.

Тепер я хочу відобразити його посередині екрана чи десь відповідно до мого вибору.

Хтось може мене орієнтувати, як цього досягти?

Відповіді:


410

З документації ,

Позиціонування тосту

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

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

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

Якщо ви хочете натиснути на позицію праворуч, збільште значення другого параметра. Щоб натиснути на нього, збільште значення останнього параметра.


11
які цілі значення там? Вони є dpi? або що таке макс?
— clifgray

9
Можливо, Gravity.CENTER_VERTICALвкажіть очевидне, але поставить тост посередині екрану.
— Фелікс

3
Зсув x і y виконано в пікселях, тому максимальною є ширина / висота дисплея.
— bluewhile

2
@ Pentium10 Документи стверджують, що зсуви в пікселях. Чи слід вважати, що це "px" одиниці, на відміну від "dp" одиниць?
— батбрат

Мої повідомлення про тости на моїй новій галактиці s6 показують у двох різних положеннях. спочатку в лівій горизонтальній центральній вертикалі, а потім рухається вниз до центральної горизонтальної, нижньої вертикальної. такий ефект не спостерігається на жодному з моїх старих тестових пристроїв. Я показую кожне повідомлення двічі поспіль, оскільки будь-які крани екрана вбивають перший тост відразу.,
— Androidcoder

150

Якщо ви отримаєте помилку, що вказує на те, що потрібно зателефонувати makeText, виправить такий код:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();

1
makeText повертає об’єкт Toast, тож ви можете просто додати .addGravity та .show після makeText.
— NikkyD

1
"якщо ви отримаєте помилку, яка вказує на те, що ви повинні зателефонувати makeText" - коли помилка з'явиться?
— Яцек Ласковський

1
Помилка трапляється, якщо ви використовуєте Constructor так new Toast(context)замістьToast.makeText(...)
— bluewhile

16

Ви можете налаштувати розташування тосту, використовуючи:

setGravity(int gravity, int xOffset, int yOffset)

док

Це дозволяє вам бути дуже конкретними щодо того, де ви хочете розташувати тост.

Однією з найбільш корисних речей щодо параметрів xOffset та yOffset є те, що ви можете використовувати їх для розміщення Toast відносно певного виду.

Наприклад, якщо ви хочете зробити спеціальний Toast, який з’являється вгорі кнопки, ви можете створити функцію на зразок цієї:

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

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

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


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

        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.