按钮上的 SpannableString 不适用于 API21?
SpannableString on button not works for API21?
我尝试使用 SpannableString 在切换按钮上放置一个图标。并在 API17 上工作,但不在 API21 上工作。
如您所见,它适用于 API17 的 Button 和 TextView,但仅适用于 API21 的 TextView('Z' 未被图标替换)。
private SpannableStringBuilder createSpanIcon(int rid, String name){
Drawable d = getActivity().getResources().getDrawable(rid);
d.setBounds(0,0,20,20);
ImageSpan imageSpan = new ImageSpan(d, DynamicDrawableSpan.ALIGN_BASELINE);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("Z\n")
.append(name)
.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
/* This give same result
builder.append("Z", imageSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("RED", new ForegroundColorSpan(Color.RED), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("\n" + name);
*/
return builder;
}
和
Button btn = (Button)v.findViewById(R.id.myButton);
SpannableStringBuilder _test = createSpanIcon(R.drawable.tc_g, "Click Me!" );
btn.setText( _test );
TextView txt = (TextView)v.findViewById(R.id.myText);
SpannableStringBuilder _test2 = createSpanIcon(R.drawable.tc_g, "I'm text" );
txt.setText( _test2 );
注意:我不想使用 setCompoundDrawablesWithIntrinsicBounds
,因为我要把图标放在 ToggleButton
上,所以 setTextOn
和 setTextOff
会为我交换图标.
有人知道为什么吗?有什么解决办法吗?
您可以通过禁用 allCaps
模式来解决此问题,默认情况下 true
用于 Material 样式的按钮。
来自代码,
txt.setAllCaps(false);
来自 XML、
<Button
...
android:textAllCaps="false" />
我尝试使用 SpannableString 在切换按钮上放置一个图标。并在 API17 上工作,但不在 API21 上工作。
如您所见,它适用于 API17 的 Button 和 TextView,但仅适用于 API21 的 TextView('Z' 未被图标替换)。
private SpannableStringBuilder createSpanIcon(int rid, String name){
Drawable d = getActivity().getResources().getDrawable(rid);
d.setBounds(0,0,20,20);
ImageSpan imageSpan = new ImageSpan(d, DynamicDrawableSpan.ALIGN_BASELINE);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("Z\n")
.append(name)
.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
/* This give same result
builder.append("Z", imageSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("RED", new ForegroundColorSpan(Color.RED), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("\n" + name);
*/
return builder;
}
和
Button btn = (Button)v.findViewById(R.id.myButton);
SpannableStringBuilder _test = createSpanIcon(R.drawable.tc_g, "Click Me!" );
btn.setText( _test );
TextView txt = (TextView)v.findViewById(R.id.myText);
SpannableStringBuilder _test2 = createSpanIcon(R.drawable.tc_g, "I'm text" );
txt.setText( _test2 );
注意:我不想使用 setCompoundDrawablesWithIntrinsicBounds
,因为我要把图标放在 ToggleButton
上,所以 setTextOn
和 setTextOff
会为我交换图标.
有人知道为什么吗?有什么解决办法吗?
您可以通过禁用 allCaps
模式来解决此问题,默认情况下 true
用于 Material 样式的按钮。
来自代码,
txt.setAllCaps(false);
来自 XML、
<Button
...
android:textAllCaps="false" />