Como mudar a posição do Toast no Android?

279

Quando uso Toastpara exibir algum texto pop-up na tela, ele exibe o texto um pouco acima da parte inferior da tela, que é a posição padrão.

Agora eu quero exibi-lo no meio da tela ou em algum lugar de acordo com minha escolha.

Alguém pode me orientar como conseguir isso?

UMAR
fonte

Respostas:

410

A partir da documentação ,

Posicionando sua torrada

Uma notificação de brinde padrão aparece próxima à parte inferior da tela, centralizada horizontalmente. Você pode mudar esta posição com o setGravity(int, int, int)método Isso aceita três parâmetros: uma Gravityconstante, um x-positiondeslocamento e um y-positiondeslocamento.

Por exemplo, se você decidir que a torrada deve aparecer no canto superior esquerdo, poderá definir a gravidade da seguinte forma:

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

Se você deseja deslocar a posição para a direita, aumente o valor do segundo parâmetro. Para empurrá-lo para baixo, aumente o valor do último parâmetro.

Pentium10
fonte
11
quais são os valores inteiros lá? Eles são dpi? ou qual é o máximo?
clifgray
9
Pode estar apontando o óbvio, mas Gravity.CENTER_VERTICALcolocará a torrada no meio da tela.
Felix30
3
o deslocamento x e y estão em pixels; portanto, o máximo é a largura / altura da tela.
bluewhile
2
@ Pentium10 Os documentos afirmam que os deslocamentos estão em pixels. Devo assumir que essas são unidades "px", em oposição às unidades "dp"?
batbrat
Minhas mensagens de brinde na minha nova galáxia s6 são exibidas em duas posições diferentes. primeiro no centro horizontal esquerdo vertical e depois desce para o centro horizontal inferior vertical. esse efeito não ocorre em nenhum dos meus dispositivos de teste mais antigos. I exibir cada mensagem duas vezes na linha desde qualquer toques na tela matar o primeiro brinde imediatamente,.
Androidcoder
150

Se você receber um erro indicando que deve chamar o makeText, o seguinte código o corrigirá:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
Rymnel
fonte
1
O makeText retorna um objeto Toast, para que você possa simplesmente adicionar .addGravity e .show após o makeText.
NikkyD 9/10/12
1
"se você receber o erro indicando que deve chamar o makeText" - quando o erro apareceria?
Jacek Laskowski
1
O erro acontece se você usar o Construtor de modo new Toast(context)em vez deToast.makeText(...)
bluewhile
16

Você pode personalizar o local do seu Toast usando:

setGravity(int gravity, int xOffset, int yOffset)

docs

Isso permite que você seja muito específico sobre onde deseja que o local do seu Toast esteja.

Uma das coisas mais úteis sobre os parâmetros xOffset e yOffset é que você pode usá-los para colocar o Toast em relação a uma determinada visualização.

Por exemplo, se você deseja fazer um Toast personalizado que aparece na parte superior de um botão, você pode criar uma função 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
fonte
2
Esta resposta stackoverflow.com/a/21026866/630833 leva em consideração o tamanho do Toast, o que foi útil para mim.
Jayeffkay #
Este é um excelente exemplo. Obrigado.
wonsuc
11
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
nzala
fonte
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();

O código acima ajudará você a exibir torradas no meio da tela ou de acordo com a sua escolha, pois isso apenas definirá a gravidade da torrada de acordo com sua necessidade

Nota: Para este processo você tem que usar o objeto Toast

user3652986
fonte
3

O método para alterar a cor, posição e cor de fundo da torrada é:

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 explicação linha por linha: https://www.youtube.com/watch?v=5bzhGd1HZOc

Mithun Adhikari
fonte
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
greg-449
2

definindo o brinde na tela superior

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

agora no fundo

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

da mesma maneira que podemos colocar torradas na esquerda, direita e também no centro

Clique aqui

Abhishek
fonte
0

// Uma classe de brinde personalizada, na qual é possível mostrar brindes personalizados ou padrão, conforme desejado)

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
fonte