9

我有这个功能在 Android 4.4.1 上运行良好,但在 5.0+ 上中断。

  public static SpannableStringBuilder prependImage(Drawable drawable, String text) {
    SpannableStringBuilder builder = new SpannableStringBuilder("  " + text);
    builder.setSpan(new ImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    return builder;
  }

我像这样使用它:

class MyButton extends Button {

    // ... snip ...

    setText(
        prependImage(
            getDrawable(imageResource, color),                     
            getContext().getString(stringResource)),
        BufferType.SPANNABLE);

这是getDrawable()上面引用的方法:

 private Drawable getDrawable(int resource, int color) {
    final Resources resources = getContext().getResources();
    Drawable drawable = resources.getDrawable(resource);
    if (drawable != null) {
      drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
      drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    }
    return drawable;
  }

当我调试时,一切似乎都成功了,但没有绘制图像。有什么想法我可能做错了吗?

4

5 回答 5

22

默认情况下,在 Material 中,按钮的样式是全部大写的。但是,用于大写的 AllCapsTransformationMethod 中存在一个错误,导致它丢弃 Spannable 数据。

您可以通过在 Button 上指定 android:textAllCaps="false" 来覆盖默认按钮样式并禁用全大写。

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

看看这里

于 2015-09-30T13:19:57.797 回答
4

您与使用 Spannables 相关的代码是可以的。您可以通过为 TextView 设置文本来检查它。

问题在于 Android 5.0 上按钮的材料设计。

<style name="Widget.Material.Button">
    <item name="background">@drawable/btn_default_material</item>
    <item name="textAppearance">?attr/textAppearanceButton</item>
    <item name="minHeight">48dip</item>
    <item name="minWidth">88dip</item>
    <item name="stateListAnimator">@anim/button_state_list_anim_material</item>
    <item name="focusable">true</item>
    <item name="clickable">true</item>
    <item name="gravity">center_vertical|center_horizontal</item>
</style>

有两种解决方案。

第一个只是使用TextView作为您的按钮并使用带有图像的 setText 。

对于另一个(可能更正确),您需要以Widget.Material.Button下列方式扩展按钮样式 ( ):

<style name="BtnStyle" parent="android:Widget.Material.Button">
    <item name="android:textAppearance">@null</item>
</style>

然后在您的布局中:

<Button
    android:id="@+id/test2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Test"
    style="@style/BtnStyle"/>

完成后,您应该会在按钮中看到图像。

不要忘记对于低于 5.0 的 Android 版本,您也应该创建BtnStyle,但在其他资源目录(res/values-v14/style.xml)中。

于 2015-09-30T07:42:44.607 回答
1

需要注意的一件事,可绘制矢量不起作用,您必须有一个可绘制的 png 或 jpeg 或传递给 ImageSpan 位图

于 2020-08-10T10:26:09.090 回答
0

也许你需要检查那个 Drawable 对象的内容,你使用 getDrawable() 来获取 Drawable 对象,但是 API 定义似乎与你的调用参数不匹配。

适用于安卓 5.0+

Drawable getDrawable(int id) 此方法在 API 级别 22 中已弃用。请改用 getDrawable(int, Theme)。

Drawable getDrawable(int id, Resources.Theme theme) 返回与特定资源 ID 关联并针对指定主题设置样式的可绘制对象。

第二个参数看起来像是一个主题,而不是颜色。对 ?

于 2015-09-30T01:46:02.593 回答
0

试试这个

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      getResources().getDrawable(R.drawable.your_drawable, getTheme());
            } else {
                getResources().
                        getDrawable(R.drawable.your_drawable);
            }
于 2015-09-30T06:54:30.713 回答