Change the color of a disabled button in android

39,321

Solution 1

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>

Solution 2

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" />

Solution 3

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"/>

Solution 4

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"/>

Solution 5

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.

Share:
39,321
nixgadget
Author by

nixgadget

Software engineer and a robotic enthusiast

Updated on December 17, 2020

Comments

  • nixgadget
    nixgadget over 3 years

    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>
    
  • Rahul Kushwaha
    Rahul Kushwaha over 4 years
    Very nice solutions