使用 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
似乎可以解决问题。
当我将 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
似乎可以解决问题。