web-dev-qa-db-fra.com

Centrer le texte dans un toast sous Android

Je me demandais s'il y avait un moyen d'afficher tout le texte dans un toast pour être centré. Par exemple, j'ai un toast qui a 2 lignes de texte. Pour des raisons purement esthétiques, je voudrais que le texte soit aligné au centre plutôt que aligné à gauche. J'ai parcouru la documentation et je ne trouve rien à ce sujet. Y at-il un moyen simple de faire cela que j'ai raté?

Merci Chris

47
Chris Robinson

Utilisez la fonction setView(view) de Toast pour fournir une View avec Gravity.CENTER.

14
Sameer Segal

Adapté de autre réponse :

Toast toast = Toast.makeText(this, "Centered\nmessage", Toast.LENGTH_SHORT);
TextView v = (TextView) toast.getView().findViewById(Android.R.id.message);
if( v != null) v.setGravity(Gravity.CENTER);
toast.show();
87
Marc

Toast est construit sur un TextView et sa gravité par défaut est alignée à gauche. Donc, vous devez créer votre propre TextView comme ceci par exemple: 

<TextView  
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent" 
    Android:gravity="center_vertical|center_horizontal"
    Android:text="all the text you want"
/>

Et vous affectez le TextView au Toast comme ceci: 

Toast t = new Toast(yourContext);
t.setView(yourNewTextView);
26
Sephy

Sans les hacks:

String text = "Some text";
Spannable centeredText = new SpannableString(text);
centeredText.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
            0, text.length() - 1,
            Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Toast.makeText(getActivity(), centeredText, Toast.LENGTH_LONG).show();

Il y a aussi un autre alignement en plus du centre.

la source

18
YetAnotherUser

C'est sale bidouillage, mais

((TextView)((LinearLayout)toast.getView()).getChildAt(0))
    .setGravity(Gravity.CENTER_HORIZONTAL);
18
Mikhail
Toast toast = Toast.makeText(this, "Message", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
8
serj

Je ne dis pas que findViewById(Android.R.id.message) est faux, mais juste au cas où il y aurait des (futures?) Différences d'implémentation, j'ai moi-même utilisé une approche légèrement différente

void centerText(View view) {
    if( view instanceof TextView){
        ((TextView) view).setGravity(Gravity.CENTER);
    }else if( view instanceof ViewGroup){
        ViewGroup group = (ViewGroup) view;
        int n = group.getChildCount();
        for( int i = 0; i<n; i++ ){
            centerText(group.getChildAt(i));
        }
    }
}

et alors:

Toast t = Toast.makeText(context, msg,Toast.LENGTH_SHORT);
centerText(t.getView());
t.show();
4
imbryk

C'est un travail pour moi:

Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER| Gravity.BOTTOM, 0, 20);
toast.show();
2
Kumar VL

Dans kotlin :

fun makeToast(context: Context, resId: Int) {
    val toast = Toast.makeText(context, resId, Toast.LENGTH_SHORT)
    val view = toast.view.findViewById<TextView>(Android.R.id.message)
    view?.let {
        view.gravity = Gravity.CENTER
    }
    toast.show()
}
0
vishnu benny

Cette variation concerne l'utilisation de LinearLayout. :)

Toast SampleToast = Toast.makeText(this, "This is the example of centered text.\nIt is multiline text.", Toast.LENGTH_SHORT);
LinearLayout OurLayout = (LinearLayout) SampleToast.getView();

if (OurLayout.getChildCount() > 0) 
{
TextView SampleView = (TextView) OurLayout.getChildAt(0);
SampleView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
}

SampleToast.show();
0