Android v23 之前的设备上的 TextView DrawableTint

Android TextView DrawableTint on pre v23 devices

有什么方法可以为 TextView 中使用的 Drawable 着色? DrawableTint 仅适用于 API 23 级及以上。

目前我正在使用 Vertical Linear Layout 来实现我的要求。

<LinearLayout style="@style/ChoiceIllustratorIconTextContainerStyle">

  <ImageView
    style="@style/ChoiceIllustratorImageStyle"
    android:contentDescription="@string/cd_university"
    android:src="@drawable/ic_account_balance_white_24dp" />

  <TextView
    style="@style/ChoiceIllustratorTextStyle"
    android:text="@string/ci_text_university" />

</LinearLayout>

看起来,

Android 工作室建议我使用 Compound DrawbleTextView 来实现这一点。我能够实现它,但我找不到 Tint 可绘制对象的方法。

<TextView
   style="@style/ChoiceIllustratorTextStyle"
   android:drawablePadding="4dp"
   android:drawableTop="@drawable/ic_account_balance_white_24dp"
   android:text="@string/ci_text_university" />

执行此操作的编程方式是

       Drawable[] drawables = textView.getCompoundDrawables();
       if (drawables[0] != null) {  // left drawable
           drawables[0].setColorFilter(color, Mode.MULTIPLY);
       }

这适用于所有 API 级别。

这是 pre-Marshmallow 设备的最佳选择。

此答案基于@kris larson 的建议。

我使用了以下方法,它在所有设备上都运行良好。

setTintedCompoundDrawable 一种自定义方法,它采用 TextView 您希望为其设置复合可绘制对象、可绘制资源 ID 和您选择的颜色的资源 ID。

private void setTintedCompoundDrawable(TextView textView, int drawableRes, int tintRes) {
    textView.setCompoundDrawablesWithIntrinsicBounds(
            null,  // Left
            Utils.tintDrawable(ContextCompat.getDrawable(getContext(), drawableRes),
                    ContextCompat.getColor(getContext(), tintRes)), // Top
            null, // Right
            null); //Bottom
    // if you need any space between the icon and text.
    textView.setCompoundDrawablePadding(12);
}

Tint tintDrawable 方法如下:

public static Drawable tintDrawable(Drawable drawable, int tint) {
    drawable = DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, tint);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_ATOP);

    return drawable;
}

AndroidX appcompat 库从版本 1.1.0-alpha03 开始​​支持在 TextView 中着色 [ref].

将依赖项添加到 appcompat 库

dependencies {
  implementation "androidx.appcompat:appcompat:1.1.0"
}

然后 TextView 中的可绘制对象可以像这样从 XML 着色

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:drawableStartCompat="@drawable/ic_plus"
  app:drawableTint="@color/red" />

别忘了包括

xmlns:app="http://schemas.android.com/apk/res-auto"

并从 AppCompatActivity 扩展您的 Activity。

对于这种情况,您可以使用 TextViewCompat class:

TextViewCompat.setCompoundDrawableTintList(TextView, ColorStateList)