70

I was wondering if there was a way to display all text in a Toast to be centered. For instance, I have a Toast that has 2 lines of text in it. For purely aesthetic reasons, I would like the text to center-aligned instead of left-aligned. I've looked through the documentation and can't find anything about it. Is there a simple way to do this that I have missed?

hata
  • 11,633
  • 6
  • 46
  • 69
Sonoman
  • 3,379
  • 9
  • 45
  • 61

11 Answers11

112

Adapted from another answer:

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();
Community
  • 1
  • 1
Marc
  • 1,425
  • 2
  • 11
  • 16
28

Toast is built on a TextView and the default gravity of it is left aligned. So, you need to create your own TextView like this for instance :

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

And you assign the TextView to the Toast like this :

Toast t = new Toast(yourContext);
t.setView(yourNewTextView);
Sephy
  • 50,022
  • 30
  • 123
  • 131
27

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

There are also another alignments besides center.

cf. Multiple alignment in TextView?

hata
  • 11,633
  • 6
  • 46
  • 69
YetAnotherUser
  • 527
  • 5
  • 12
19

It is dirty hack, but

((TextView)((LinearLayout)toast.getView()).getChildAt(0))
    .setGravity(Gravity.CENTER_HORIZONTAL);
Mikhail
  • 568
  • 1
  • 6
  • 22
  • 2
    Great! Make sure you surround with a `ClassCastException` catch to be safe in case the view hierarchy of Toasts changes in the future. – mxcl Feb 27 '12 at 19:20
  • This works on my Nexus 4. I suggest doing this, wrapping it with a ClassCastException as Max Howell said above and then live with it when it throws an actual exception. – Johan S Mar 23 '13 at 09:17
  • 2
    use findViewById(android.R.id.message) on the view returned by toast.getView() to ensure working code on all versions – erlando Oct 21 '13 at 12:02
15

Use the Toast's setView(view) function to supply a View with Gravity.CENTER.

Richard Erickson
  • 2,568
  • 8
  • 26
  • 39
Sameer Segal
  • 21,813
  • 7
  • 42
  • 56
13
Toast toast = Toast.makeText(this, "Message", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
serj
  • 373
  • 2
  • 4
5

Not saing that findViewById(android.R.id.message) is wrong, but just in case there are (future?) implementation differences I myself used a bit differen approach:

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

and then:

Toast t = Toast.makeText(context, msg,Toast.LENGTH_SHORT);
centerText(t.getView());
t.show();
imbryk
  • 1,778
  • 1
  • 16
  • 19
3

In 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()
}
vishnu benny
  • 998
  • 1
  • 11
  • 15
1

It is work for me:

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

This variation is with using LinearLayout in your layout xml :)

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();
Aldan
  • 674
  • 9
  • 23
  • This is a hacky solution that might not work in future versions of android, for example if the first child is not a TextView. Does not follow Java coding standards. – Leandro Glossman Nov 16 '15 at 19:30
-3
Toast t=Toast.makeText(getApplicationContext(),"Text",Toast.LENGTH_LONG);
t.setText("Password Does't match...");
t.setGravity(0, 0, 0);
t.show();

simple code for toast most be center

Raiv
  • 5,731
  • 1
  • 33
  • 51
  • Welcome to SO. Please look through the [help page on answering questions.](http://stackoverflow.com/help/how-to-answer). As written, your code is poorly formatted and does not contain an explanation. – Richard Erickson Feb 03 '16 at 20:01
  • Sorry, but your code set gravity center to the toast (it appear in center screen), not to the text – Leonardo Sapuy Apr 20 '16 at 17:11