318 votes

Comment changer la position du Toast dans Android ?

Quand j'utilise Toast pour afficher un texte contextuel à l'écran, il affiche le texte un peu au-dessus du bas de l'écran, ce qui est la position par défaut.

Maintenant je veux l'afficher au milieu de l'écran ou quelque part selon mon choix.

Quelqu'un peut-il me guider pour y parvenir ?

452voto

Pentium10 Points 68884

De la documentation ,

Positionnement de votre toast

Une notification de toast standard apparaît près du bas de l'écran, centrée horizontalement. Vous pouvez modifier cette position à l'aide du bouton setGravity(int, int, int) méthode. Celle-ci accepte trois paramètres : un Gravity constante, une x-position et un y-position compensation.

Par exemple, si vous décidez que le toast doit apparaître dans le dans le coin supérieur gauche, vous pouvez définir la gravité comme suit :

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

Si vous voulez déplacer la position vers la droite, augmentez la valeur du second paramètre. le deuxième paramètre. Pour la déplacer vers le bas, augmentez la valeur du dernier paramètre. paramètre.

11 votes

Quelles sont les valeurs entières ? Sont-ils des dpi ? ou quel est le maximum ?

13 votes

C'est peut-être une évidence, mais Gravity.CENTER_VERTICAL placera le toast au milieu de l'écran.

3 votes

Les décalages x et y sont en pixel, donc le maximum est la largeur/hauteur de votre écran.

171voto

Rymnel Points 2127

Si vous obtenez une erreur indiquant que vous devez appeler makeText, le code suivant la corrigera :

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

3 votes

MakeText renvoie un objet Toast, de sorte que vous pouvez simplement ajouter .addGravity et .show après le makeText.

1 votes

"si vous obtenez l'erreur indiquant que vous devez appeler makeText" - Quand l'erreur apparaît-elle ?

1 votes

L'erreur se produit si vous utilisez le Constructeur ainsi new Toast(context) au lieu de Toast.makeText(...)

28voto

abdulwasey20 Points 539

De la documentation :

Avertissement : À partir d'Android Build.VERSION_CODES#R, pour les applications ciblant le niveau API Build.VERSION_CODES#R ou supérieur, cette méthode ( setGravity ) ne fonctionne pas lorsqu'il est appelé sur des toasts de texte.

Ce qui signifie que setGravity ne peut plus être utilisé dans l'API 30+ et il faudra en trouver un autre pour obtenir le comportement requis.

2 votes

Et je me demande pourquoi ils ont fait ça...

17voto

JDJ Points 1194

Vous pouvez personnaliser l'emplacement de votre Toast en utilisant :

setGravity(int gravity, int xOffset, int yOffset)

docs

Cela vous permet d'être très précis quant à l'emplacement de votre Toast.

L'un des aspects les plus utiles des paramètres xOffset et yOffset est que vous pouvez les utiliser pour placer le Toast par rapport à une certaine vue.

Par exemple, si vous souhaitez créer un Toast personnalisé qui apparaît au-dessus d'un bouton, vous pouvez créer une fonction comme celle-ci :

// 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 votes

Cette réponse stackoverflow.com/a/21026866/630833 prend en compte la taille du Toast, ce qui m'a été utile.

0 votes

C'est un excellent exemple. Merci.

12voto

nzala Points 324
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X