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
Utilisez la fonction setView(view)
de Toast pour fournir une View
avec Gravity.CENTER
.
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();
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);
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.
C'est sale bidouillage, mais
((TextView)((LinearLayout)toast.getView()).getChildAt(0))
.setGravity(Gravity.CENTER_HORIZONTAL);
Toast toast = Toast.makeText(this, "Message", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
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();
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();
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()
}
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();