Search code examples
androidandroid-drawableandroid-button

How to change drawable tint of a button below api level 23 programmatically in android


I am trying to figure out how to change the color of drawableLeft/drawableRight of button programmatically . I have used drawable tint in my xml as mentioned below which works > api level 23 but not able to change the color < api level 23

 <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="VIEW ALL"
                android:layout_centerInParent="true"
                android:background="#00000000"
                android:drawableLeft="@mipmap/ic_menu_black_36dp"
                android:layout_centerVertical="true"
                android:id="@+id/view_all"
                android:textColor="@color/bottom_color"
                android:drawableTint="@color/bottom_color"
                />
      Button  prev = (Button) findViewById(R.id.prev);

   Drawable[] drawables  =prev.getCompoundDrawables();
         drawables[0].setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
        prev.setCompoundDrawables(drawables[0],null,null,null);

Solution :

 Drawable[] drawablesprev  =prev.getCompoundDrawables();

//for drawableleft drawable array index 0  

  drawablesprev[0].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);

//for drawableright drawable array index 2  
drawablesprev[2].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);


//for drawabletop drawable array index 1
  drawablesprev[1].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);

Solution

  • you are using PorterDuff.Mode.MULTIPLY, so you are multiplying colors. assuming (name of your drawable) your icon is black - #000000 or as int it will be 0. then 0 * GRAY (or any other color) will always give you 0, so still black...

    try other PorterDuff.Modes, e.g. PorterDuff.Mode.SRC_ATOP or PorterDuff.Mode.SRC_IN

    your current code will probably work with white version of icon, which should be colored properly with MULTIPLY