Coloring Schaltflächen in Android mit Material Design und AppCompat

? mail929 @ | Original: StackOverFlow

Bevor die AppCompat update kam heute konnte ich die Farbe der Tasten in Android L ändern, aber nicht auf älteren Versionen . Durch die Einbeziehung der neuen AppCompat Update Ich bin nicht in der Lage, um die Farbe für beide Versionen zu ändern, wenn ich versuchen, die Taste verschwindet . Weiß jemand, wie man auf die Schaltfläche Farbe ändern?

Die folgenden Bilder zeigen, was ich erreichen will :

Coloring Schaltflächen in Android mit Material Design und AppCompat

Der weiße Knopf ist standardmäßig die rote ist, was ich will .

Das ist, was ich bisher zu tun, um die Farbe der Tasten in ändern styles.xml :

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

und um es dynamisch zu tun :

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

Auch ich habe das Thema ändern Elternteil von @android:style/Theme.Material.Light.DarkActionBar auf Theme.AppCompat.Light.DarkActionBar

Top 5 Antwort

1Justin Powell @

Tasten sind nicht im AppCompat Bibliothek noch nicht unterstützt. Vom http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html :

Widget tinting

Wenn auf Geräten mit Android 5.0 mit, alle Widgets   getönt mit dem Farbschema -Attribute [ colorPrimary ,   colorPrimaryDark, colorAccent, colorControlNormal, etc.] . es gibt   zwei Hauptmerkmale, die diese über Lollipop ermöglichen : ziehfähigen Tönen, und   Referenzierung Themenattribute ( von der Form ? attr / foo ) in drawables .

AppCompat bietet ein ähnliches Verhalten in früheren Versionen von Android   für eine Teilmenge von UI Widgets:

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

Button Ist merklich abwesend . Sieht so aus, wir müssen erst zu einem zukünftigen Update warten .

2eluleci @

Seit dass AppCompat unterstützt nicht die Taste noch Sie xml als Hintergrund verwenden können. Um dies zu tun, dass ich einen Blick auf den Quellcode des Android und fand die zugehörigen Dateien für das Styling Material Tasten .

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

Schauen Sie sich die https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_material.xml .

Sie können die Datei in Ihre Projekte drawable - v21 -Ordner kopieren . Aber nicht berühren die Farbe attr hier . Die Datei, die Sie ändern müssen, ist die zweite Datei .

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

Wie Sie erkennen, gibt es eine Form innerhalb dieses Zeichenfläche verwendet, die Sie finden können 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

Und in dieser Datei, die Sie gibt es einige Dimensionen aus der Datei verwendet https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/dimens_material.xml . Sie können die gesamte Datei zu kopieren und in den Ordner -Werte setzen . Dies ist für die Anwendung der gleichen Größe auf alle Tasten (die im Materialmenü verwendet )

4 - Create another drawable file for old versions

Bei älteren Versionen sollten Sie eine andere Zeichenfläche mit dem gleichen Namen haben. Ich bin direkt die Elemente setzen Inline anstelle der Referenzierung . Du hast die Möglichkeit, sie zu verweisen. Aber auch hier ist die wichtigste Sache, die ursprünglichen Abmessungen des Materials Taste.

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

Ihre Taste wird Dominoeffekt auf Lollipop Geräte. Die alten Versionen genau selbe Taste außer der Dominoeffekt haben . Aber da, dass Sie bieten drawables für unterschiedliche Zustände, werden sie auch auf Ereignisse reagieren zu berühren ( wie die alte Art und Weise ) .

3kiruwka @

Wenn Sie nur "Flat" Material -Taste können Sie den Hintergrund individuell mit http://developer.android.com/reference/android/R.attr.html#selectableItemBackground Attribut wie erläutert http://stackoverflow.com/a/ 27932664/2358786 .