Come cambiare la posizione di Toast in Android?


279

Quando uso Toastper visualizzare del testo popup sullo schermo, viene visualizzato un po 'sopra la parte inferiore dello schermo, che è la posizione predefinita.

Ora voglio visualizzarlo al centro dello schermo o da qualche parte secondo la mia scelta.

Qualcuno può guidarmi come raggiungere questo obiettivo?

Risposte:


410

Dalla documentazione ,

Posizionamento del tuo toast

Una notifica di toast standard appare nella parte inferiore dello schermo, centrata orizzontalmente. È possibile modificare questa posizione con il setGravity(int, int, int)metodo Questo accetta tre parametri: una Gravitycostante, un x-positionoffset e un y-positionoffset.

Ad esempio, se decidi che il toast dovrebbe apparire nell'angolo in alto a sinistra, puoi impostare la gravità in questo modo:

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

Se si desidera spostare la posizione verso destra, aumentare il valore del secondo parametro. Per spostarlo verso il basso, aumentare il valore dell'ultimo parametro.


11
quali sono i valori interi lì? Sono dpi? o qual è il massimo?
clifgray,

9
Potrebbe essere evidente l'ovvio, ma Gravity.CENTER_VERTICALmetterà il brindisi al centro dello schermo.
Felix,

3
Gli offset xey sono in pixel, quindi il massimo è la larghezza / altezza del display.
bluewhile,

2
@ Pentium10 I documenti affermano che gli offset sono in pixel. Dovrei supporre che si tratti di unità "px", al contrario di unità "dp"?
Batbrat,

I miei messaggi di brindisi sulla mia nuova galassia s6 mostrano in 2 diverse posizioni. prima nel centro orizzontale sinistro verticale e poi si sposta in basso al centro orizzontale, in basso verticale. questo effetto non si verifica su nessuno dei miei vecchi dispositivi di test. Visualizzo ogni messaggio due volte di fila poiché qualsiasi
tocco

150

Se viene visualizzato un errore che indica che è necessario chiamare makeText, il codice seguente lo risolverà:

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

1
makeText restituisce un oggetto Toast, quindi puoi semplicemente aggiungere .addGravity e .show dopo makeText.
NikkyD

1
"se viene visualizzato l'errore che indica che è necessario chiamare makeText" - quando verrà visualizzato l'errore?
Jacek Laskowski il

1
L'errore si verifica se si utilizza il costruttore in tal modo new Toast(context)invece diToast.makeText(...)
bluewhile

16

Puoi personalizzare la posizione di Toast usando:

setGravity(int gravity, int xOffset, int yOffset)

docs

Ciò ti consente di essere molto specifico su dove vuoi che si trovi la posizione di Toast.

Una delle cose più utili sui parametri xOffset e yOffset è che puoi usarli per posizionare Toast in relazione a una determinata vista.

Ad esempio, se si desidera creare un toast personalizzato che appare sopra un pulsante, è possibile creare una funzione come questa:

// 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
Questa risposta stackoverflow.com/a/21026866/630833 , prende in considerazione le dimensioni di Toast, il che mi è stato utile.
Jayeffkay,

Questo è un ottimo esempio. Grazie.
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();

Il codice sopra riportato ti aiuterà a visualizzare il brindisi al centro dello schermo o in base alla tua scelta, basta impostare la gravità del brindisi in base alle tue necessità

Nota: per questo processo devi usare l'oggetto di Toast


3

Il metodo per modificare il colore, la posizione e il colore di sfondo del toast è:

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

Per la spiegazione riga per riga: https://www.youtube.com/watch?v=5bzhGd1HZOc


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Greg-449,

2

impostazione brindisi nella schermata principale

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

ora in fondo

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

allo stesso modo possiamo impostare il brindisi a sinistra, a destra e anche al centro

Clicca qui


0

// Una classe di toast personalizzata in cui è possibile mostrare toast personalizzati o predefiniti come desiderato)

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

        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.