spannablestring 不适用于以编程方式创建的按钮

spannablestring is not working for programmatically created button

我知道 SpannableString 可以在一个文本视图中设置不同的文本大小,但如果以编程方式添加文本视图,则它不起作用。

String s = "Best Ever";
SpannableString ss1 =  new SpannableString(s);
ss1.setSpan(new RelativeSizeSpan(2f), 0, 4, 0); // set size
ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 4, 0); // set color
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(ss1); 

如您所见,它适用于 API17 的 Button 和 TextView,但仅适用于 API21

的 TextView

有趣!我注意到 API 21 上的按钮全部大写..所以删除所有大写.

默认情况下,Material 按钮的样式设置为全部大写显示文本。但是,用于大写的 AllCapsTransformationMethod ( bug details ) 中存在一个错误,导致它丢弃 Spannable 数据。

您可以通过禁用 allCaps 模式来覆盖默认按钮样式,对于 Material 样式的小部件默认情况下是这样。

来自代码,

txt.setAllCaps(false);

来自 XML,

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