按钮setText与Spannable在Android 5.0 Lollipop上无法工作

28

我有一个简单的 按钮

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

尝试通过以下方式更改文本属性:

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

它可以在Android 4.3上运行,但不能在5.0上运行。

有趣的是,当我将实现从Button更改为TextView时,它在5.0上可以正常工作。似乎是Lollipop中Button的问题。


它可以在Android 4.3上运行,但无法在5.0上运行。这里的“无法”是指如果您使用AbsoluteSizeSpan,那么它可能会丢失,因为Android 5.0似乎更想控制标题,例如强制将它们全部转换为大写字母。 - CommonsWare
@CommonsWare 是的,span 被忽略了。 - klimat
我认为有很多开发者对 Android 5.0 强制使用大写字母来显示标题感到不满。如果有解决这一问题的方法,就可以让你的AbsoluteSizeSpan继续工作。 - CommonsWare
你可以关闭所有大写字母。在谷歌或SO上搜索即可。 - alanv
1个回答

90

默认情况下,Material 按钮的样式会将所有文本都显示为大写字母。然而,在用于大写化的 AllCapsTransformationMethod 中存在一个 bug,导致它会丢弃 Spannable 数据。

您可以通过在 Button 上指定 android:textAllCaps="false" 来覆盖默认按钮样式并禁用全部大写。

<Button
    ...
    android:textAllCaps="false" />

24
又是安卓系统出现的诡异问题...当你把TextView的setAllCaps属性设置为true时,Spannable就无法工作了。在我的情况下,我使用了一个ForegroundColorSpannable。谢谢您的回答。 - Michal
更多讨论,请参见:https://dev59.com/H1wY5IYBdhLWcg3wwqA5#32867216?noredirect=1#comment53573775_32867216 - i_am_jorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接