Як змінити позицію 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.