Button setText with Spannable doesn't work for Android 5.0 Lollipop
Asked Answered
B

1

28

I have a simple Button:

<Button
    android:id="@+id/test"
    android:textColor="@color/white"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

and try to change text property by:

SpannableString span = new SpannableString(text);
span.setSpan(new AbsoluteSizeSpan(8, true), 5, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
testButton.setText(span);

It works on Android 4.3 but doesn't on 5.0.

The interesting thing is when I change implementation from Button to TextView it works fine on 5.0. Seems to be something with Button in Lollipop.

Bergama answered 12/3, 2015 at 10:50 Comment(4)
"It works with Android 4.3, but doesn't with 5.0." -- please define what "doesn't" means here. If you mean that your AbsoluteSizeSpan is lost, that does not shock me, as Android 5.0 seems to want to control the captions more, such as forcing them to all caps.Exsert
@Exsert yes, span is ignored.Bergama
I would expect that there are many developers who are irritated with Android 5.0's default of all-caps for the caption. If there is a workaround for blocking that behavior, it might also allow your AbsoluteSizeSpan to continue working.Exsert
You can turn off all caps. Search on Google or SO.Logarithmic
L
90

By default, Material buttons are styled to show text in all-caps. However, there is a bug in the AllCapsTransformationMethod used for capitalization that causes it to discard Spannable data.

You can override the default button styling and disable all-caps by specifying android:textAllCaps="false" on your Button.

<Button
    ...
    android:textAllCaps="false" />
Logarithmic answered 15/3, 2015 at 3:4 Comment(2)
Another wtf Android moment...when you have TextView with setAllCaps set to true, Spannables stops working. In my case was a ForegroundColorSpannable. Thank you for answer.Lalita
For more discussion, please see: #32258106Enterovirus

© 2022 - 2024 — McMap. All rights reserved.