pre v23设备上的Android TextView DrawableTint

时间:2017-01-11 10:19:16

标签: android textview xml-drawable

我们有什么方法可以对Drawable中使用的TextView进行着色吗? 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>

看起来像enter image description here

Android工作室建议我使用Compound DrawbleTextView来实现此目的。而且我能够实现它,但我无法找到Tint drawable的方法。

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

4 个答案:

答案 0 :(得分:15)

执行此操作的编程方法是

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

这适用于所有API级别。

这是Marshmallow之前设备的最佳选择。

答案 1 :(得分:12)

自版本1.1.0-alpha03 [{ref] 开始,AndroidX appcompat库在TextView中支持着色。

向appcompat库添加依赖项

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

然后可以像这样从XML着色TextView中的drawable

<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开始扩展您的活动。

答案 2 :(得分:10)

这个答案是基于@kris larson的建议。

我使用以下方法,它在所有设备上都能正常工作。

setTintedCompoundDrawable一种自定义方法,它采用您想要设置复合可绘制的TextView,一个可绘制的res id&amp;和你选择的颜色。

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;
}

答案 3 :(得分:1)

在这种情况下,您可以使用TextViewCompat类:

TextViewCompat.setCompoundDrawableTintList(TextView, ColorStateList)