Ich habe mich gefragt, ob es eine Möglichkeit gibt, den gesamten Text in einem Toast anzuzeigen, der zentriert werden soll. Zum Beispiel habe ich einen Toast mit 2 Textzeilen. Aus rein ästhetischen Gründen möchte ich, dass der Text zentriert statt linksbündig ist. Ich habe die Dokumentation durchgesehen und kann nichts darüber finden. Gibt es eine einfache Möglichkeit, die ich vermisst habe?
Danke Chris
Verwenden Sie die Funktion setView(view)
des Toast, um eine View
mit Gravity.CENTER
bereitzustellen.
Angepasst von eine andere Antwort :
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 basiert auf einer TextView und die Standardgravitation davon ist links ausgerichtet. So müssen Sie beispielsweise Ihre eigene TextView erstellen:
<TextView
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:gravity="center_vertical|center_horizontal"
Android:text="all the text you want"
/>
Und Sie weisen dem Toast die TextView folgendermaßen zu:
Toast t = new Toast(yourContext);
t.setView(yourNewTextView);
Ohne die 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();
Neben der Mitte gibt es noch andere Ausrichtungen.
Es ist ein dreckiger Hack, aber
((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();
Ich sage nicht, dass findViewById(Android.R.id.message)
falsch ist, aber für den Fall, dass es (zukünftige?) Implementierungsunterschiede gibt, habe ich selbst einen etwas anderen Ansatz verwendet:
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));
}
}
}
und dann:
Toast t = Toast.makeText(context, msg,Toast.LENGTH_SHORT);
centerText(t.getView());
t.show();
Es ist Arbeit für mich:
Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER| Gravity.BOTTOM, 0, 20);
toast.show();
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()
}
Diese Variante bezieht sich auf die Verwendung von 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();