Botones para colorear en Android con Material Design y AppCompat


Antes de que la actualización AppCompat saliera hoy, pude cambiar el color de los botones en Android L, pero no en versiones anteriores. Después de incluir la nueva actualización AppCompat no puedo cambiar el color para ninguna de las versiones, cuando intento el botón simplemente desaparece. ¿Alguien sabe cómo cambiar el color del botón?

Las siguientes imágenes muestran lo que quiero lograr:

imagen que muestra el resultado deseado

El botón blanco es predeterminado, el rojo es lo que quiero.

Esto es lo que yo era haciendo previamente para cambiar el color de los botones en el styles.xml:

<item name="android:colorButtonNormal">insert color here</item>

Y hacerlo dinámicamente:

button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);

También cambié el tema padre de @android:style/Theme.Material.Light.DarkActionBar a Theme.AppCompat.Light.DarkActionBar

Author: reVerse, 2014-10-23

25 answers

Oficialmente fijado en la Biblioteca de Soporte rev.22 (viernes 13 de marzo de 2015). Ver problema relevante de código de Google:

Https://issuetracker.google.com/issues/37008632

Ejemplo de Uso

Tema.xml:

<item name="colorButtonNormal">@color/button_color</item>

V21/tema.xml

<item name="android:colorButtonNormal">@color/button_color</item>
 205
Author: WindRider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-10 14:49:21

Editar (22.06.2016):

Appcompat la biblioteca comenzó a admitir botones de material después de publicar la respuesta original. En este post puedes ver la implementación más fácil de los botones elevados y planos.

Respuesta original:

Dado que AppCompat no admite el botón, puede usar xml como fondos. Para hacer eso, eché un vistazo al código fuente del Android y encontré los archivos relacionados para los botones de material de estilo.

1-Mira la implementación original del botón material de la fuente.

Echa un vistazo al btn_default_material.xml en el código fuente de Android .

Puede copiar el archivo en la carpeta projects drawable-v21. Pero no toques el color attr aquí. El archivo que necesita cambiar es el segundo archivo.

Drawable-v21 / custom_btn.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>

2-Obtener la forma del botón material original

Como te das cuenta hay una forma usada dentro de esto drawable que puedes encontrar en este archivo del código fuente.

<inset xmlns:android="http://schemas.android.com/apk/res/android"
   android:insetLeft="@dimen/button_inset_horizontal_material"
   android:insetTop="@dimen/button_inset_vertical_material"
   android:insetRight="@dimen/button_inset_horizontal_material"
   android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
    <corners android:radius="@dimen/control_corner_material" />
    <solid android:color="?attr/colorButtonNormal" />
    <padding android:left="@dimen/button_padding_horizontal_material"
             android:top="@dimen/button_padding_vertical_material"
             android:right="@dimen/button_padding_horizontal_material"
             android:bottom="@dimen/button_padding_vertical_material" />
</shape>

3-Obtener las dimensiones del botón material

Y en este archivo hay algunas dimensiones utilizadas del archivo que puedes encontrar aquí. Puede copiar todo el archivo y ponerlo en su carpeta values . Esto es importante para aplicar el mismo tamaño (que se usa en botones de material) a todos los botones

4-Crear otro archivo de elemento de diseño para el antiguo versiones

Para versiones anteriores debería tener otro elemento de diseño con el mismo nombre. Estoy colocando directamente los elementos en línea en lugar de hacer referencia. Es posible que desee hacer referencia a ellos. Pero de nuevo, lo más importante son las dimensiones originales del botón de material.

Drawable / custom_btn.xml

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

    <!-- pressed state -->
    <item android:state_pressed="true">
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/PRESSED_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- focused state -->
    <item android:state_focused="true">
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/FOCUSED_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- normal state -->
    <item>
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/NORMAL_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>
</selector>

Resultado

Su botón tendrá efecto dominó en los dispositivos Lollipop. Las versiones antiguas tendrán exactamente el mismo botón excepto el efecto dominó. Pero desde que proporcione elementos de diseño para diferentes estados, también responderán a los eventos táctiles (como la forma antigua).

 148
Author: eluleci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 10:56:30

Esto se ha mejorado en la v23.0. 0 de AppCompat library con la adición de más temas, incluyendo

Widget.AppCompat.Botón.Coloreado

En primer lugar, incluya la dependencia de AppCompat si aún no lo ha hecho

compile('com.android.support:appcompat-v7:23.0.0') {
    exclude group: 'com.google.android', module: 'support-v4'
}

Ahora, ya que necesita usar v23 de la aplicación compat, también tendrá que dirigirse a SDK-v23.

    compileSdkVersion = 23
    targetSdkVersion = 23

En su values/theme

<item name="android:buttonStyle">@style/BrandButtonStyle</item>

En su values/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/yourButtonColor</item>
    <item name="android:textColor">@color/White</item>
</style>

En su values-v21/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="android:colorButtonNormal">@color/yourButtonColor</item>
    <item name="android:textColor">@color/White</item>
</style>

Desde el tema del botón se basa en Widget.AppCompat.Button.Colored El color del texto en el botón es por defecto blanco!

Pero parece que hay un problema cuando se deshabilita el botón, el botón cambiará su color a gris claro, pero el color del texto permanecerá blanco!

Una solución para esto es establecer específicamente el color del texto en el botón en blanco! como he hecho en el estilo mostrado arriba.

Ahora puedes simplemente definir tu botón y dejar que AppCompat haga el resto:)

<Button
        android:layout_width="200dp"
        android:layout_height="48dp" />

Desactivado Estado Estado discapacitado

Estado Habilitado Estado Habilitado

 105
Author: Muhammad Alfaifi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-22 21:58:06

En la Biblioteca de soporte de Android 22.1.0, Google hizo el tinte Button consciente. Por lo tanto, otra forma de personalizar el color de fondo de button es usar el atributo backgroundTint.

Por ejemplo,

<Button
       android:id="@+id/add_remove_button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:backgroundTint="@color/bg_remove_btn_default"
       android:textColor="@android:color/white"
       tools:text="Remove" />
 61
Author: Manabu-GT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-28 14:01:42

Para admitir botones de colores, use la biblioteca AppCompat más reciente(>23.2.1) con:

Inflate - XML

Widget AppCompat:

android.support.v7.widget.AppCompatButton

Estilo AppCompat:

style="@style/Widget.AppCompat.Button.Colored"

NB! Para establecer un color personalizado en xml: use el attr: app en lugar de android

(use alt+enter o declare xmlns:app="http://schemas.android.com/apk/res-auto" to use app)

App: backgroundTint= "@color / your_custom_color "

Ejemplo:

<android.support.v7.widget.AppCompatButton
     style="@style/Widget.AppCompat.Button.Colored"
     app:backgroundTint="@color/your_custom_color"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"     
     android:text="Colored Button"/>

O conjunto it programáticamente-JAVA

 ViewCompat.setBackgroundTintList(your_colored_button,
 ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
 34
Author: TouchBoarder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 18:39:26

Con la última biblioteca de soporte, podría heredar su actividad de AppCompatActivity, por lo que inflará su Button como AppCompatButton y le dará la oportunidad de darle estilo al color de cada botón en el diseño con el uso de android:theme="@style/SomeButtonStyle", donde SomeButtonStyle es:

<style name="SomeButtonStyle" parent="@android:style/Widget.Button">
    <item name="colorButtonNormal">@color/example_color</item>
</style>

Funcionó para mí en 2.3.7, 4.4.1, 5.0.2

 25
Author: Artem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-01 12:45:24

Si quieres debajo del estilo

introduzca la descripción de la imagen aquí

Añade este estilo a tu botón

style="@style/Widget.AppCompat.Button.Borderless.Colored"

Si quieres este estilo

introduzca la descripción de la imagen aquí

Añádase el siguiente código

style="@style/Widget.AppCompat.Button.Colored"
 16
Author: Jinu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 10:31:24

La respuesta está en TEMA no estilo

El problema es que el color del botón se pega al colorButtonNormal del tema. He intentado cambiar el Estilo de muchas maneras diferentes sin suerte. Así que cambié el tema del botón.

Crea un tema con colorButtonNormal y colorPrimary:

<style name="ThemeAwesomeButtonColor" parent="AppTheme">
    <item name="colorPrimary">@color/awesomePrimaryColor</item>
    <item name="colorButtonNormal">@color/awesomeButtonColor</item>
</style>

Utilice este tema en el botón

<Button
        android:id="@+id/btn_awesome"
        style="@style/AppTheme.Button"
        android:theme="@style/ThemeAwesomeButtonColor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_awesome"/>

El " AppTheme.Botón " puede ser cualquier cosa extiende estilo de botón como aquí uso color primario para el texto color:

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    ...
    <item name="android:textColor">?attr/colorPrimary</item>
    ...
</style>

Y obtienes el botón en cualquier color que quieras que sea compatible con material design.

 13
Author: lonelyboycs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 03:07:08

Acabo de crear una biblioteca de Android, que le permite modificar fácilmente el color del botón y el color de la ondulación

Https://github.com/xgc1986/RippleButton

<com.xgc1986.ripplebutton.widget.RippleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    android:text="Android button modified in layout"
    android:textColor="@android:color/white"
    app:buttonColor="@android:color/black"
    app:rippleColor="@android:color/white"/>

No es necesario crear un estilo para cada botón que desee con un color diferente, lo que le permite personalizar los colores al azar

 4
Author: xgc1986,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-01 14:47:04

Esto funciona para mí con appcompat-v7: 22.2.0 en android + 4.0

En sus estilos.xml

<style name="Button.Tinted" parent="Widget.AppCompat.Button">
    <item name="colorButtonNormal">YOUR_TINT_COLOR</item>
    <item name="colorControlHighlight">@color/colorAccent</item>
    <item name="android:textColor">@android:color/white</item>
</style>

En su archivo de diseño

<Button
    android:id="@+id/but_next"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/but_continue"
    android:theme="@style/Button.Tinted" />
 4
Author: ingyesid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-17 17:37:11

Diseño:

<android.support.v7.widget.AppCompatButton
  style="@style/MyButton"
  ...
  />

Styles.xml:

<style name="MyButton" parent="Widget.AppCompat.Button.Colored">
  <item name="backgroundTint">@color/button_background_selector</item>
  <item name="android:textColor">@color/button_text_selector</item>
</style>

Color / button_background_selector.xml:

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

Color / button_text_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#888888"/>
    <item android:color="#ffffff"/>
</selector>
 4
Author: BArtWell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 17:56:48

Para aquellos que usan un ImageButton aquí es cómo lo hacen:

Con estilo.xml:

<style name="BlueImageButton" parent="Base.Widget.AppCompat.ImageButton">
    <item name="colorButtonNormal">@color/primary</item>
    <item name="android:tint">@color/white</item>
</style>

En v21/style.xml:

<style name="BlueImageButton" parent="Widget.AppCompat.ImageButton">
    <item name="android:colorButtonNormal">@color/primary</item>
    <item name="android:tint">@color/white</item>
</style>

Luego en su archivo de diseño:

<android.support.v7.widget.AppCompatImageButton
    android:id="@+id/my_button"
    android:theme="@style/BlueImageButton"
    android:layout_width="42dp"
    android:layout_height="42dp"
    android:layout_gravity="center_vertical"
    android:src="@drawable/ic_check_black_24dp"
    />
 3
Author: Micro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-09 23:33:57

Si usa la solución de estilo con colorButtonNormal, no olvide heredar del widget .AppCompat.Botón.Coloreado por lo que el efecto dominó está funcionando;)

Me gusta

<style name="CustomButtonStyle" parent="Widget.AppCompat.Button.Colored">
      <item name="colorButtonNormal">@android:color/white</item>
</style>
 3
Author: didi.yeah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-07 18:36:12

Si solo desea un botón de material "plano", puede personalizar su fondo usando el atributo selectableItemBackground como se explica aquí.

 1
Author: kiruwka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Para mí, el problema era que en Android 5.0 el android:colorButtonNormal no tenía ningún efecto, y en realidad, ningún elemento del tema (como android:colorAccent), pero en Android 4.4.3, por ejemplo, lo hizo. El proyecto se configuró con compileSdkVersion y targetSdkVersion a 22, así que he hecho todos los cambios como @Muhammad Alfaifi sugessted, pero al final, he notado que el problema era el buildToolsVersion, que no se actualizó. Una vez cambié a 23.0.1, todo empieza a funcionar casi con normalidad. Ahora, el android:colorButtonNormal todavía no tiene efecto, pero al menos el botón reacciona a android:colorAccent, que para mí es aceptable.

Espero que esta pista pueda ayudar a alguien. Nota: He aplicado el estilo directamente al botón, ya que el android:theme=[...] del botón tampoco tuvo efecto.

 1
Author: Bianca D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 16:07:46

Una forma de lograr esto te permite apuntar a un estilo y NO a un tema TODOS los botones de tu aplicación de la misma manera.
En temas.xml añadir un tema

    <style name="Theme.MyApp.Button.Primary.Blue" parent="Widget.AppCompat.Button">
        <item name="colorButtonNormal">@color/someColor</item>
        <item name="android:textColorPrimary">@android:color/white</item>
    </style>

Ahora en estilos.xml add

    <style name="MyApp.Button.Primary.Blue" parent="">
        <item name="android:theme">@style/Theme.MyApp.Button.Primary.Blue</item>
    </style>

Ahora en su diseño simplemente apunte al ESTILO en su Botón

    <Button
        ...
        style="@style/MyApp.Button.Primary.Blue"
        ...  />
 1
Author: Douglas 'DK' Knudsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 16:04:00

ACTUALIZAR

Use biblioteca de soporte de diseño (23.2.0) y appcompatwidgets como se muestra a continuación

En la Biblioteca de Soporte de Android 22.1 :

Esto se hace automáticamente al inflar diseños-botón de reemplazo con AppCompatButton, TextView con AppCompatTextView, etc. garantizar que cada uno podría soportar el teñido. En esta versión, los tint conscientes los widgets ahora están disponibles públicamente, lo que le permite mantener el tinte soporte incluso si lo necesita subclase uno de los widgets.

La lista completa de widgets tint aware:

AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView

Diseño de Materiales para Dispositivos Pre-Lollipop :

AppCompat (también conocido como ActionBarCompat) comenzó como un backport de la Android 4.0 ActionBar API para dispositivos que se ejecutan en Gingerbread, proporcionar una capa de API común en la parte superior de la implementación backported y la aplicación del marco. AppCompat v21 ofrece una API y conjunto de características actualizado con Android 5.0


 1
Author: Amit Vaghela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-09 05:17:23

Si desea utilizar el estilo AppCompat como Widget.AppCompat.Botón , Base.Widget.AppCompat.Botón.Coloreado, etc., necesita usar estos estilos con vistas compatibles de la biblioteca de soporte.

El siguiente código no funciona para dispositivos pre-lolipop:

<Button
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:theme="@style/Widget.AppCompat.Button" />

Debe usar AppCompatButton para habilitar los estilos de AppCompat:

<android.support.v7.widget.AppCompatButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:theme="@style/Widget.AppCompat.Button" />
 1
Author: farukcankaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 10:41:52

En realidad no quería un cambio en mis estilos de botón personalizados, pero desafortunadamente ya no estaban funcionando.

Mi Aplicación tiene una versión minSdk de 9 y todo funcionaba antes.

No se por qué pero desde que eliminé el androide: antes del ButtonStyle parece funcionar de nuevo

Ahora = trabajando:

<item name="buttonStyle">@style/ButtonmyTime</item>

Antes = solo botones de material gris:

<item name="android:buttonStyle">@style/ButtonmyTime</item>

No tengo ninguna carpeta spezial para la versión de Android newver ya que mis botones son bastante planos y deben tener el mismo aspecto en todas las versiones de Android.

Tal vez alguien puede decirme por qué tuve que eliminar el "android:" El botón ImageButton sigue funcionando con"android:"

<item name="android:imageButtonStyle">@style/ImageButtonmyTimeGreen</item>
 0
Author: stefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 00:03:42

Después de 2 días buscando respuestas, la tematización del botón no funcionó para mí en API

Mi única solución es anular el tintado de AppCompatButton no solo con el tema base de la aplicación "colorButtonNormal", sino también con el backgroundTint de la vista de esta manera:

public class AppCompatColorButton extends AppCompatButton {

    public AppCompatColorButton(Context context) {
        this(context, null);
    }

    public AppCompatColorButton(Context context, AttributeSet attrs) {
        this(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle);
    }

    public AppCompatColorButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (TintManager.SHOULD_BE_USED) {
            setSupportBackgroundTintList(createButtonColorStateList(getContext(), attrs, defStyleAttr));
        }
    }

    static final int[] DISABLED_STATE_SET = new int[]{-android.R.attr.state_enabled};
    static final int[] FOCUSED_STATE_SET = new int[]{android.R.attr.state_focused};
    static final int[] PRESSED_STATE_SET = new int[]{android.R.attr.state_pressed};
    static final int[] EMPTY_STATE_SET = new int[0];

    private ColorStateList createButtonColorStateList(Context context, AttributeSet attrs, int defStyleAttr) {
        final int[][] states = new int[4][];
        final int[] colors = new int[4];
        int i = 0;

        final int themeColorButtonNormal = ThemeUtils.getThemeAttrColor(context, android.support.v7.appcompat.R.attr.colorButtonNormal);
        /*TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.backgroundTint }, defStyleAttr, 0);
        final int colorButtonNormal = a.getColor(0, themeColorButtonNormal);*/
        TypedArray a = context.obtainStyledAttributes(attrs, android.support.v7.appcompat.R.styleable.View, defStyleAttr, 0);
        final int colorButtonNormal = a.getColor(android.support.v7.appcompat.R.styleable.View_backgroundTint, themeColorButtonNormal);
        a.recycle();
        final int colorControlHighlight = ThemeUtils.getThemeAttrColor(context, android.support.v7.appcompat.R.attr.colorControlHighlight);

        // Disabled state
        states[i] = DISABLED_STATE_SET;
        colors[i] = ThemeUtils.getDisabledThemeAttrColor(context, android.support.v7.appcompat.R.attr.colorButtonNormal);
        i++;

        states[i] = PRESSED_STATE_SET;
        colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
        i++;

        states[i] = FOCUSED_STATE_SET;
        colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
        i++;

        // Default enabled state
        states[i] = EMPTY_STATE_SET;
        colors[i] = colorButtonNormal;
        i++;

        return new ColorStateList(states, colors);
    }
}

Luego puede definir el color de su botón de esta manera :

<com.example.views.AppCompatColorButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="#ffff0000"
            app:backgroundTint="#ffff0000"
            android:text="Button"
            android:textColor="@android:color/white" />
 0
Author: Thomas G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 16:43:07

Para cambiar el color de un solo botón

ViewCompat.setBackgroundTintList(button, getResources().getColorStateList(R.color.colorId));
 0
Author: Jaydeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 12:33:17

Esta respuesta me ayudó a llegar a una respuesta https://stackoverflow.com/a/30277424/3075340

Utilizo este método de utilidad para establecer el tinte de fondo de un botón. Funciona con dispositivos pre-lollipop:

// Set button background tint programmatically so it is compatible with pre-lollipop devices.
public static void setButtonBackgroundTintAppCompat(Button button, ColorStateList colorStateList){
    Drawable d = button.getBackground();
    if (button instanceof AppCompatButton) {
        // appcompat button replaces tint of its drawable background
        ((AppCompatButton)button).setSupportBackgroundTintList(colorStateList);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Lollipop button replaces tint of its drawable background
        // however it is not equal to d.setTintList(c)
        button.setBackgroundTintList(colorStateList);
    } else {
        // this should only happen if
        // * manually creating a Button instead of AppCompatButton
        // * LayoutInflater did not translate a Button to AppCompatButton
        d = DrawableCompat.wrap(d);
        DrawableCompat.setTintList(d, colorStateList);
        button.setBackgroundDrawable(d);
    }

}

Cómo usar en código:

Utility.setButtonBackgroundTintAppCompat(myButton,
ContextCompat.getColorStateList(mContext, R.color.your_custom_color));

De esta manera, no tiene que especificar una lista de colores si solo desea cambiar el tinte de fondo y nada más que mantener los efectos de botones bonitos y lo que no.

 0
Author: Micro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Establezco android:textColor a @null en mi tema de botón y ayuda.

Styles.xml

<style name="Button.Base.Borderless" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:textColor">@null</item>
</style>

Alguién_layout.xml

<Button
    style="@style/Button.Base.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hint" />

Ahora el color del texto del botón es colorAccent definido en AppTheme

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/colorAccent</item>
    <item name="borderlessButtonStyle">@style/Button.Base.Borderless</item>
    <item name="alertDialogTheme">@style/AlertDialog</item>
</style>
 0
Author: Denis Rybnikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 09:37:40

Yo uso esto. Efecto dominó y botón haga clic en sombra de trabajo.

Estilo.xml

<style name="Button.Red" parent="Widget.AppCompat.Button.Colored">
    <item name="android:textColor">@color/material_white</item>
    <item name="android:backgroundTint">@color/red</item>
</style>

Botón en el diseño:

<Button
        style="@style/Button.Red"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/close"/>
 0
Author: Mete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 14:16:38

Otra solución simple usando el AppCompatButton

<android.support.v7.widget.AppCompatButton
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     style="@style/Widget.AppCompat.Button.Colored"
     app:backgroundTint="@color/red"
     android:text="UNINSTALL" />
 0
Author: Hanzyusuf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 18:48:37