使用AppCompat主题时,SpannableString无法正常工作

时间:2015-03-28 13:11:12

标签: android android-appcompat spannablestring

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

我有一个按钮,其文本设置为SpannableString。当我使用Holo主题时,文本按预期呈现,但是当我切换到AppCompat主题时,span效果会被忽略。如何使用AppCompat主题使SpannableString工作?

enter image description here

styles.xml - 当在这两个主题之间切换时,我会得到截然不同的结果......

<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;
    }
}

1 个答案:

答案 0 :(得分:8)

嗯,它与appcompat-v7无关。如果您完全删除主题内容,并且只使用默认主题,则在Android 5.0+上您将获得Theme.Material,并且可以看到相同的效果。

材料设计美学的一部分是按钮标题应该是全部大写,但是它们实现了消除你的跨度。 appcompat-v7可以在5.0之前的设备上使用您的代码,建议他们的backported小部件效果不包含app-caps内容,并且他们将委托给5.0 +上的标准小部件。

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