Pulsanti Colorare in Android con materiali Progettazione e AppCompat

? mail929 @ | Original: StackOverFlow

Prima l'aggiornamento AppCompat è venuto fuori oggi sono stato in grado di cambiare il colore di pulsanti in Android L, ma non su versioni precedenti . Dopo aver incluso il nuovo aggiornamento AppCompat non sono in grado di cambiare il colore per entrambe le versioni, quando faccio provare il pulsante scompare . Qualcuno sa come cambiare il colore del pulsante ?

Le seguenti immagini mostrano quello che voglio realizzare :

Pulsanti Colorare in Android con materiali Progettazione e AppCompat

Il pulsante bianco è di default, quello rosso è quello che voglio .

Questo è quello che stavo facendo in precedenza per cambiare il colore dei tasti nel styles.xml :

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

e di farlo in modo dinamico :

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

Inoltre ho fatto cambiare il genitore tema da @android:style/Theme.Material.Light.DarkActionBar a Theme.AppCompat.Light.DarkActionBar



Top 5 Respuesta

1Justin Powell @

I pulsanti non sono ancora supportati nella libreria AppCompat . Dal http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html :

Widget tinting

Quando si esegue su dispositivi con Android 5.0, tutti i widget sono   colorato con il tema del colore attribuisce [ ColorPrimary ,   colorPrimaryDark, colorAccent, colorControlNormal, ecc ] . ci sono   due caratteristiche principali che consentono questo su Lollipop : colorazione drawable, e   riferimento tema attributi ( della forma ? attr / foo) in drawable .

AppCompat fornisce un comportamento simile nelle versioni precedenti di Android   per un sottoinsieme di widget UI :

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

Button È notevolmente assente . Sembra che dovremo aspettare fino a quando un futuro aggiornamento .



2eluleci @

Dal momento che AppCompat non supporta il tasto ancora è possibile utilizzare XML come sfondi . Per farlo ho dato un'occhiata al codice sorgente di Android e ha trovato i file correlati per lo styling pulsanti materiali.

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

Date un'occhiata al https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_material.xml .

È possibile copiare il file in vostri progetti cartella drawable - V21 . Ma non toccare l' attr colore qui . Il file è necessario modificare è il secondo file .

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

Come vi rendete conto ci sia una forma utilizzata all'interno di questa drawable che potete trovare in 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 in questo file che ci sono alcune dimensioni utilizzati dal file https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/dimens_material.xml . È possibile copiare l'intero file e mettere nella cartella dei valori . Questo è importante per l'applicazione della stessa dimensione ( che viene utilizzato in pulsanti materiali) a tutti i pulsanti

4 - Create another drawable file for old versions

Per le versioni precedenti si dovrebbe avere un altro drawable con lo stesso nome . Sto mettendo direttamente gli articoli in linea invece di riferimento . Si consiglia di fare riferimento a loro . Ma ancora, la cosa più importante è la dimensione originale del pulsante materiale .

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

Il vostro tasto avrà effetto a catena su dispositivi Lollipop . Le vecchie versioni avranno esattamente lo stesso tasto, tranne l' effetto a catena . Ma dal momento che fornite drawable per diversi stati, faranno anche rispondere a toccare gli eventi ( come il vecchio modo ) .

3kiruwka @

Se desideri solo pulsante dei materiali " Flat", è possibile personalizzare il loro background utilizzando http://developer.android.com/reference/android/R.attr.html#selectableItemBackground attributo come spiegato http://stackoverflow.com/a/ 27932664/2358786 .