web-dev-qa-db-ja.com

Android v23以前のデバイスのTextView DrawableTint

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する方法が見つかりません。

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

この回答は、@ kris larsonの提案に基づいています。

私は次の方法を使用し、すべてのデバイスで正常に動作しています。

setTintedCompoundDrawable複合ドローアブル、ドローアブル解像度、および選択した色の解像度IDを設定するTextViewを取得するカスタムメソッド。

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

これを行うプログラム的な方法は

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

これはすべてのAPIレベルで機能します。

これは、マシュマロ以前のデバイスに最適なオプションです。

18
kris larson

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からアクティビティを拡張します。

3
shinwan