35

Is there a way to change the color of a disabled button in android through styles or some other form ?

I currently have the following,

drawable/button_default.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_default_shape"/>
</selector>

drawable/button_default_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid android:color="@color/button_default_background"/>
    <corners android:radius="3dp"/>
</shape>

values/styles.xml

<style name="AppTheme.Button">
    <item name="android:background">@drawable/button_default</item>
    <item name="android:textColor">@android:color/white</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:paddingTop">10dp</item>
    <item name="android:paddingBottom">10dp</item>
    <item name="android:focusable">true</item>
    <item name="android:clickable">true</item>
    <item name="android:gravity">center</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">17sp</item>
    <item name="android:textAppearance">@style/CustomFontAppearance</item>
</style>
pnuts
  • 58,317
  • 11
  • 87
  • 139
nixgadget
  • 6,983
  • 16
  • 70
  • 103

6 Answers6

52

You'll have to use a selector for different drawables in those states.

You can create a selector like this:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/your_enabled_drawable" android:state_enabled="true" />
    <item android:drawable="@drawable/your_disabled_drawable" android:state_enabled="false" />
    <!-- default state-->
    <item android:drawable="@drawable/your_enabled_drawable" />
</selector>
AndroidEnthusiast
  • 6,557
  • 10
  • 42
  • 56
12

Specify the color in selector for android:state_enabled="false" as drawable

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false">
        <shape>
            <solid android:color="#32ff09" />
        </shape>
    </item>
</selector>

And apply this drawable resource to background of button

 <Button
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/drawble_name"
    android:enabled="false"
    android:text="Selector Applied Button" />
Prabakaran
  • 537
  • 2
  • 16
8

UPDATE: For Android MaterialButton

For Android MaterialButton there are two solutions, one for SDK >= v21 and another for SDK < v21.

Here I am also giving how to change the text color of the button depending whether it is enabled or disabled.

First create two color selector .xml file in your color folder. One for button color and another for button text color. For example button_state_colors.xml for button color and button_text_state_colors.xml for text color.

Here are those two color files:

  1. button_state_colors.xml:

     <?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
         <item android:state_enabled="true" android:color="#303F9F" />
         <item android:state_enabled="false" android:color="#BBBBBB" />
     </selector>
    
  2. button_text_state_colors.xml:

     <?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
         <item android:state_enabled="true" android:color="#FFFFFF" />
         <item android:state_enabled="false" android:color="#555555" />
     </selector>
    

Now for all versions of Android SDK you can change the color of button and it's text using style like:

in style.xml:

<style name="Widget.AppTheme.MaterialButton" parent="Widget.MaterialComponents.Button">
    <item name="backgroundTint">@color/button_state_colors</item>
    <item name="android:textColor">@color/button_text_state_colors</item>
</style>

in layout.xml:

<com.google.android.material.button.MaterialButton
    android:id="@+id/button"
    style="@style/Widget.AppTheme.MaterialButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Only for SDK >= 21 you can direct change button color without using style like:

<com.google.android.material.button.MaterialButton
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/button_state_colors"/>
Md. Yamin Mollah
  • 1,609
  • 13
  • 26
6

Try this -

drawable/bg_button.xml :-

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/bg_button_focused" android:state_selected="true"/>
    <item android:drawable="@drawable/bg_button_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_button_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/bg_button_normal"/>

</selector>

After this just set background on your button like this -

<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_button"
    android:text="Button"/>
Varundroid
  • 9,135
  • 14
  • 63
  • 93
4

Another way to achieve this is to create a color selector.

Create a file

res/color/your_color.xml

which looks like

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorDisabledBackground" android:state_enabled="false" />
    <item android:color="@color/colorEnabledBackground" />
</selector>

Then you may use it as a regular color

in a style:

<style name="YourStyle">
     <item name="android:background">@color/your_color</item>
     <item name="android:textColor">@android:color/black</item>
</style>

As well is in layouts, shapes or in code as etc.

Leo DroidCoder
  • 14,527
  • 4
  • 62
  • 54
0

Here is my code which works properly with button enable and disable state.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_enabled="true" android:drawable="@drawable/ic_button_gradient"/>
   <item android:state_enabled="false" android:drawable="@color/gray"/>
</selector>
ajay singh
  • 169
  • 1
  • 5