Jak zmienić pozycję Toast w Androidzie?

279

Kiedy używam Toastdo wyświetlania wyskakującego tekstu na ekranie, wyświetla on tekst nieco powyżej dolnej części ekranu, co jest pozycją domyślną.

Teraz chcę wyświetlić go na środku ekranu lub gdzieś według mojego wyboru.

Czy ktoś może mi pomóc, jak to osiągnąć?

UMAR
źródło

Odpowiedzi:

410

Z dokumentacją ,

Pozycjonowanie Toast

Standardowe powiadomienie toast pojawia się w dolnej części ekranu, wyśrodkowane poziomo. Możesz zmienić tę pozycję za pomocą setGravity(int, int, int)metody. Akceptuje to trzy parametry: Gravitystałą, x-positionprzesunięcie i y-positionprzesunięcie.

Na przykład, jeśli zdecydujesz, że toast powinien pojawić się w lewym górnym rogu, możesz ustawić grawitację w następujący sposób:

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

Jeśli chcesz przesunąć pozycję w prawo, zwiększ wartość drugiego parametru. Aby przesunąć go w dół, zwiększ wartość ostatniego parametru.

Pentium10
źródło
11
jakie są tam liczby całkowite? Czy są dpi? lub jaka jest maksymalna?
clifgray
9
Może wskazywać to, co oczywiste, ale Gravity.CENTER_VERTICALumieści toast na środku ekranu.
Felix
3
Przesunięcie xiy są w pikselach, więc maksymalna jest szerokość / wysokość wyświetlania.
bluewhile
2
@ Pentium10 Dokumenty stwierdzają, że przesunięcia są w pikselach. Czy powinienem założyć, że są to jednostki „px”, a nie jednostki „dp”?
batbrat
Moje wiadomości toastowe na mojej nowej galaktyce s6 pokazują się w 2 różnych pozycjach. najpierw w lewym poziomym środkowym pionie, a następnie przesuwa się w dół do środkowego poziomego, dolnego pionowego. ten efekt nie występuje na żadnym z moich starszych urządzeń testowych. Wyświetlam każdą wiadomość dwa razy z rzędu, ponieważ jakiekolwiek
dotknięcie
150

Jeśli pojawi się błąd wskazujący, że musisz wywołać makeText, następujący kod to naprawi:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
Rymnel
źródło
1
makeText zwraca obiekt Toast, więc możesz po prostu dodać .addGravity i .show po makeText.
NikkyD
1
„jeśli pojawi się błąd wskazujący, że musisz wywołać makeText” - kiedy pojawi się błąd?
Jacek Laskowski
1
Błąd występuje, jeśli użyjesz Konstruktora, więc new Toast(context)zamiastToast.makeText(...)
bluewhile 1'13
16

Możesz dostosować lokalizację swojego Toast za pomocą:

setGravity(int gravity, int xOffset, int yOffset)

dokumenty

To pozwala ci bardzo precyzyjnie określić, gdzie ma znajdować się Twoja Toast.

Jedną z najbardziej przydatnych rzeczy w parametrach xOffset i yOffset jest to, że można ich użyć do umieszczenia Toast względem określonego Widoku.

Na przykład, jeśli chcesz utworzyć niestandardowy Toast, który pojawia się na przycisku, możesz utworzyć funkcję podobną do tej:

// 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
źródło
2
Ta odpowiedź stackoverflow.com/a/21026866/630833 uwzględnia rozmiar Toast, co było dla mnie pomocne.
jayeffkay
To świetny przykład. Dzięki.
wonsuc,
11
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
nzala
źródło
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();

Powyższy kod pomoże u wyświetlić toast na środku ekranu lub zgodnie z twoim wyborem, po prostu ustaw grawitację według potrzeb

Uwaga: Do tego procesu musisz użyć obiektu Toast

użytkownik3652986
źródło
3

Metodą zmiany koloru, położenia i koloru tła tostów jest:

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

Wyjaśnienie linia po linii: https://www.youtube.com/watch?v=5bzhGd1HZOc

Mithun Adhikari
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
greg-449,
2

ustawianie tostów na górnym ekranie

toast.setView(view);
toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show(); 

teraz na dole

 toast.setView(view);
 toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show();  

w ten sam sposób możemy ustawić toast w lewo, w prawo, a także w środku

Kliknij tutaj

Abhishek
źródło
0

// Niestandardowa klasa tostów, w której można wyświetlać niestandardowe lub domyślne tosty według potrzeb)

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
źródło