使用 AppCompat 主题时 SpannableString 不起作用

SpannableString not working when using AppCompat theme

当我将 AppTheme 设置为 Theme.AppCompat.Light.DarkActionBar 时,我无法让 SpannableString 工作。

我有一个按钮,它的文本是用 SpannableString 设置的。当我使用 Holo 主题时,文本会按预期呈现,但当我切换到 AppCompat 主题时,跨度效果接缝将被忽略。如何使用 AppCompat 主题让 SpannableString 工作?

styles.xml - 在这 2 个主题之间切换时,我得到非常不同的结果...

<resources>
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" />
  <!--<style name="AppTheme" parent="@android:style/Theme.Holo.Light" />-->
</resources>

...对于我使用 SpannableString

的按钮
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);

        String detail = "ABC";
        String caption = String.format("2 %s", detail);
        Spannable span = new SpannableString(caption);

        int detailIndex = caption.indexOf(detail);

        span.setSpan(new StyleSpan(Typeface.BOLD), 0, detailIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        span.setSpan(new RelativeSizeSpan(0.5f), detailIndex, detailIndex+detail.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        button.setText(span);

        return rootView;
    }
}

好吧,它与 appcompat-v7 无关。如果你完全删除主题的东西,只使用默认主题,在 Android 5.0+ 上你会得到 Theme.Material,并且可以在那里看到相同的效果。

Material 设计美学的一部分是按钮标题应该全部大写,但是它们的实现方式正在消除您的跨度。 appcompat-v7 在 5.0 之前的设备上使用您的代码,这表明他们向后移植的小部件效果不包括 app-caps 内容,并且他们正在委托给 5.0+ 上的标准小部件。

android:textAllCaps="false" 添加到布局中的 Button 似乎可以解决问题。