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>
Androidスタジオでは、Compound Drawble
をTextView
とともに使用してこれを実現することを推奨しています。そして、それを達成することはできますが、ドローアブルをTint
する方法が見つかりません。
<TextView
style="@style/ChoiceIllustratorTextStyle"
Android:drawablePadding="4dp"
Android:drawableTop="@drawable/ic_account_balance_white_24dp"
Android:text="@string/ci_text_university" />
この回答は、@ 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;
}
これを行うプログラム的な方法は
Drawable[] drawables = textView.getCompoundDrawables();
if (drawables[0] != null) { // left drawable
drawables[0].setColorFilter(color, Mode.MULTIPLY);
}
これはすべてのAPIレベルで機能します。
これは、マシュマロ以前のデバイスに最適なオプションです。
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
からアクティビティを拡張します。