DrawableCompat tinting does not work on pre-Lollipop

I’m using the new TextInputLayout to wrap an EditText. When I determine a field has an error I do the following:

Drawable drawable = DrawableCompat.wrap(getEditText().getBackground());

DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED));

This works on 5.0 and turns the underline red, but does nothing on 4.4 or 4.1 test devices. What am I missing here? Seems so simple and according to google “just works”… pretty sure I have the latest version of it as well:

  • Failed to instantiate com.android.menubar.internal.MenuBarEnhancerCocoa
  • Lollipop's backgroundTint has no effect on a Button
  • Save a (.txt) file to the Assets Folder in Android?
  • Android new Bottom Navigation bar
  • Google Analytics Android SDK V4 confusion
  • Null pointer exception in suggestions popup window on Samsung Galaxy Android 7
  • compile ‘com.android.support:design:22.2.0′

    FWIW, if I do setColorFilter instead of setTint then it works on all platforms but then I have issues with it going away and not coming back as soon as the focus is set/left/etc… I’d prefer to do it with tint (and really prefer to have the tint apply to the focus and non-focus states if anybody is looking for extra credit lol)


    Related posts:

    The specified child already has a parent. You must call removeView() on the child's parent ...
    Why go for Constraints layout as we already have Relative Layout?
    Dynamic control of action/menu items in ActionBar
    BroadcastReceiver with multiple filters or multiple BroadcastReceivers?
    Android Design Support TabLayout overlapping content
    Cannot see Nexus 6P for debugging
  • problems with Android NDK-7 and AWK
  • Does react native compile JavaScript into Java for Android?
  • Handle Paging with RxJava
  • How to add border around linear layout except at the bottom?
  • Using orientation sensor to point towards a specific location
  • Why this line xmlns:android=“http://schemas.android.com/apk/res/android” must be the first in the layout xml file?
  • One Solution collect form web for “DrawableCompat tinting does not work on pre-Lollipop”

    When you call wrap() then the original Drawable is wrapped internally into a new DrawableWrapper which is used to implement the tinting on older devices. So to make it work you have to set the returned Drawable back to the EditText:

    final Drawable originalDrawable = editText.getBackground();
    final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
    DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(Color.RED));

    Since version 23.2.0 of the support library you can also use setTint() instead of setTintList() to set just one tint color without having to create a ColorStateList.

    DrawableCompat.setTint(wrappedDrawable, Color.RED);

    If you want to ensure backwards compatibility beyond API level 16 you run into a little snag. setBackground() was added in API level 16 and you need to call setBackgroundDrawable() on devices before that. It’s best to implement a helper method which does that for you:

    public static void setBackground(View view, Drawable background) {
        } else {
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.