2017-01-11 3 views
5

Есть ли какой-либо способ, которым мы можем оттенять Drawable, используемый в TextView? DrawableTint работает только на уровне API 23 и выше.Android TextView DrawableTint на устройствах pre v23

В настоящее время я использую 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 Drawble с TextView для достижения этой цели. И я могу добиться этого, но я не могу найти способ сделать Tint доступным.

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

Может это поможет: http://stackoverflow.com/questions/29155463/drawable-tinting-for-api-21 – Gudin

+0

Я проверил, что, для моего случая это не полезно. Спасибо –

ответ

4

Этот ответ основан на предложении @kris larson.

Я использую следующие методы и отлично работает на всех устройствах.

setTintedCompoundDrawable настраиваемый метод, который принимает TextView, на который вы хотели бы установить составную вытягиваемую, идентификатор возвращаемого значения & и идентификатор res вашего выбора цвета.

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

Оттенок 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; 
} 
9

Программный способ сделать это

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

Это работает для всех уровней API.

Это ваш лучший вариант для устройств с предгорьями.

+3

И если вам нужно использовать другой цвет на другом экране или для разных состояний представления, я считаю, что вы захотите «mutate()' drawable before call setColorFilter. – user3175580

+1

PorterDuff.Mode.MULTIPLY не работает для меня. Вместо этого PorterDuff.Mode.SRC_ATOP работает для меня. Использует ли PorterDuff.Mode.MULTIPLY для вас? –

+0

SRC_ATOP - это то, на что рассчитывал OP, поэтому неудивительно, что он работает и для вас. Не помню точно, но я думаю, что, возможно, я использовал рисование со всеми белыми пикселями, так что MULTIPLY и SRC_ATOP выглядели бы почти одинаково. Метод OP по использованию классов совместимости также является лучшим вариантом. –

Смежные вопросы