Colorir Botões em Android com design Material e AppCompat

? mail929 @ | Original: StackOverFlow
---

Antes do AppCompat update saiu hoje eu era capaz de mudar a cor dos botões L em Android, mas não em versões mais antigas . Depois de incluir a nova atualização AppCompat eu sou incapaz de mudar a cor para uma ou outra versão, quando eu tentar fazer o botão simplesmente desaparece . Alguém sabe como mudar a cor do botão ?

As imagens a seguir mostra o que eu quero alcançar :

Colorir Botões em Android com design Material e AppCompat

O botão branco é padrão, o vermelho é o que eu quero.

Isto é o que eu estava fazendo anteriormente para mudar a cor dos botões no styles.xml :

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

e fazê-lo de forma dinâmica :

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

Também fiz mudar o pai tema de @android:style/Theme.Material.Light.DarkActionBar para Theme.AppCompat.Light.DarkActionBar

---

Top 5 Responder

1Justin Powell @

Os botões não são suportados na biblioteca AppCompat ainda. A partir do http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html :

Widget tinting

Quando executados em dispositivos com Android 5.0, todos os widgets são   tingido usando o tema da cor atributos [ ColorPrimary ,   colorPrimaryDark, colorAccent, colorControlNormal, etc. ] . tem   duas características principais que permitem isso em Lollipop : tintométrico drawable, e   referenciando tema atributos ( do formulário ? attr / foo ) em drawables .

AppCompat fornece comportamento semelhante em versões anteriores do Android   para um subconjunto de widgets de interface do usuário :

Everything provided by AppCompat’s toolbar (action modes, etc) EditText Spinner CheckBox RadioButton Switch (use the new android.support.v7.widget.SwitchCompat) CheckedTextView

Button É visivelmente ausente . Parece que vamos ter que esperar até que uma atualização futura.

2eluleci @

Desde que AppCompat não suporta o botão ainda você pode usar xml como pano de fundo . Para fazer isso eu tinha uma olhada no código fonte do Android e encontrou os arquivos relacionados para denominar botões materiais.

1 - Look at the original implementation of material button from source.

Dê uma olhada no https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_material.xml .

Você pode copiar o arquivo em seus projetos de pasta drawable - v21 . Mas não toque na attr cor aqui. O arquivo que você precisa mudar é o segundo arquivo.

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 - Get the shape of the original material button

Como você percebe que há uma forma utilizada dentro deste drawable que você pode encontrar em https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_mtrl_shape.xml .

<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 - Getting dimensions of the material button

E neste arquivo que existem algumas dimensões utilizadas a partir do arquivo https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/dimens_material.xml . Você pode copiar o arquivo inteiro e colocar em sua pasta valores. Isto é importante para a aplicação do mesmo tamanho ( que é usado em botões de material ) a todos os botões

4 - Create another drawable file for old versions

Para versões mais antigas, você deve ter um outro drawable com o mesmo nome . Estou colocando diretamente os itens em linha, em vez de referenciar . Você pode querer fazer referência a eles . Mas, novamente, a coisa mais importante é as dimensões originais do botão 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>
Result

Seu botão não terá efeito cascata em dispositivos pirulito . As antigas versões terão exatamente a mesma tecla, exceto o efeito cascata . Mas desde que você forneça drawables para diferentes estados, que também vai responder a eventos de toque ( como a maneira de idade) .

3kiruwka @

Se você só quer botão material de " Flat", você pode personalizar seu fundo usando http://developer.android.com/reference/android/R.attr.html#selectableItemBackground atributo como explicou http://stackoverflow.com/a/ 27932664/2358786 .