¿Cómo cambiar la posición de Toast en Android?

279

Cuando uso Toastpara mostrar texto emergente en la pantalla, muestra el texto un poco por encima de la parte inferior de la pantalla, que es la posición predeterminada.

Ahora quiero mostrarlo en el medio de la pantalla o en algún lugar según mi elección.

¿Alguien puede guiarme para lograr esto?

UMAR
fuente

Respuestas:

410

De la documentación ,

Colocando tu tostada

Aparece una notificación de tostada estándar cerca de la parte inferior de la pantalla, centrada horizontalmente. Puedes cambiar esta posición con el setGravity(int, int, int)método. Esto acepta tres parámetros: una Gravityconstante, un x-positiondesplazamiento y un y-positiondesplazamiento.

Por ejemplo, si decide que la tostada debe aparecer en la esquina superior izquierda, puede establecer la gravedad de esta manera:

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

Si desea empujar la posición hacia la derecha, aumente el valor del segundo parámetro. Para empujarlo hacia abajo, aumente el valor del último parámetro.

Pentium10
fuente
11
¿Cuáles son los valores enteros allí? ¿Son dpi? o cuál es el máximo?
clifgray
9
Podría estar señalando lo obvio, pero Gravity.CENTER_VERTICALpondrá la tostada en el medio de la pantalla.
Felix
3
Los desplazamientos xey están en píxeles, por lo que el máximo es el ancho / alto de la pantalla.
bluewhile 01 de
2
@ Pentium10 Los documentos indican que los desplazamientos están en píxeles. ¿Debo suponer que estas son unidades "px", a diferencia de las unidades "dp"?
Batbrat
Mis mensajes brindis en mi nuevo galaxy s6 se muestran en 2 posiciones diferentes. primero en el centro horizontal izquierdo vertical y luego se mueve hacia abajo al centro horizontal, vertical inferior. Este efecto no ocurre en ninguno de mis dispositivos de prueba más antiguos. Muestro cada mensaje dos veces seguidas, ya que cualquier
toque en la
150

Si recibe un error que indica que debe llamar a makeText, el siguiente código lo solucionará:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
Rymnel
fuente
1
makeText devuelve un objeto Toast, por lo que simplemente puede agregar .addGravity y .show después de makeText.
NikkyD
1
"si obtiene el error que indica que debe llamar a makeText" , ¿cuándo aparecerá el error?
Jacek Laskowski
1
El error ocurre si usa el Constructor así que en new Toast(context)lugar deToast.makeText(...)
bluewhile el
16

Puede personalizar la ubicación de su Toast utilizando:

setGravity(int gravity, int xOffset, int yOffset)

docs

Esto le permite ser muy específico sobre dónde desea que esté la ubicación de su Toast.

Una de las cosas más útiles sobre los parámetros xOffset e yOffset es que puede usarlos para colocar el Toast en relación con una vista determinada.

Por ejemplo, si desea hacer un Toast personalizado que aparece encima de un Botón, puede crear una función como esta:

// 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
fuente
2
Esta respuesta stackoverflow.com/a/21026866/630833 , toma en cuenta el tamaño de Toast, lo cual fue útil para mí.
jayeffkay
Este es un gran ejemplo. Gracias.
wonsuc
11
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
nzala
fuente
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();

El código anterior le ayudará a mostrar tostadas en el medio de la pantalla o de acuerdo con su elección para eso solo configure la gravedad de la tostada de acuerdo con su necesidad

Nota: Para este proceso, debe usar el objeto Toast

user3652986
fuente
3

El método para cambiar el color, la posición y el color de fondo de la tostada es:

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

Para una explicación línea por línea: https://www.youtube.com/watch?v=5bzhGd1HZOc

Mithun Adhikari
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia.
greg-449
2

establecer tostadas en la pantalla superior

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

ahora en el fondo

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

de la misma manera podemos poner tostadas en izquierda, derecha y también en el centro

Haga clic aquí

Abhishek
fuente
0

// Una clase de brindis personalizada donde puede mostrar tostadas personalizadas o predeterminadas, según lo desee)

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
fuente