按钮上的SpannableString不适用于API21?

时间:2015-02-28 05:26:46

标签: android android-5.0-lollipop spannablestring

我尝试使用SpannableString在切换按钮上放置一个图标。并且在API17上工作,但在API21上没有。

spanable string on button and text

正如您所看到的,它可以在Button17和TextView for API17上工作,但仅在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上,以便setTextOnsetTextOff为我交换图标

任何人都知道为什么?和任何解决方法?

1 个答案:

答案 0 :(得分:13)

您可以通过禁用allCaps模式解决此问题,默认情况下,true为素材样式按钮。

来自代码,

txt.setAllCaps(false);

来自XML,

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