spannablestring не работает для программно созданной кнопки

Я знаю, что 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); 

Ответ 1

Как видите, он работает на Button и TextView for API17, но работает на TextView только на API21

Интересно! Я заметил, что кнопка на API 21 - это все заглавные буквы.. Так что удалите все заглавные буквы.

По умолчанию кнопки "Материал" предназначены для отображения текста заглавными буквами. Однако есть ошибка в AllCapsTransformationMethod (подробности ошибки), используемой для заглавных букв, которая заставляет его отбрасывать данные Spannable.

Вы можете переопределить стиль кнопок по умолчанию, отключив режим allCaps, который является истинным по умолчанию для виджетов в стиле Material.

Из кода

txt.setAllCaps(false);

Из XML,

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