Окраска Кнопки в Android с материалом Дизайн и AppCompat

? mail929 @ | Original: StackOverFlow
---

ПередAppCompat обновление вышел сегодня я был в состоянии изменить цвет кнопки в Android л, но не на более старых версиях . После включения нового AppCompat обновления я не могу изменить цвет для любой версии, когда я стараюсь кнопку просто исчезает . Кто-нибудь знает, как изменить цвет кнопки ?

Следующие изображения показывают то, что я хочу добиться :

Окраска Кнопки в Android с материалом Дизайн и AppCompat

Белая кнопка по умолчанию ,красный, чего я хочу .

Это то, что я делал ранее, чтобы изменить цвет кнопок вstyles.xml :

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

и делать это динамически :

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

Кроме того, я сделал изменить тему родителю @android:style/Theme.Material.Light.DarkActionBar до Theme.AppCompat.Light.DarkActionBar

---

Top 5 ответ

1Justin Powell @

Кнопки не поддерживаются в библиотеке AppCompat еще . С http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html :

Widget tinting

При работе на устройствах с Android 5.0, все виджеты   тонированные с помощью цветовой гамме атрибуты [ colorPrimary ,   colorPrimaryDark, colorAccent, colorControlNormal и т.д.] . Есть   две главных особенности, которые позволяют это на леденец : холст тонировка, и   ссылки тему атрибуты (вида ? атр / Foo ) в вводимого коэффициента .

AppCompat обеспечивает подобное поведение на более ранних версиях Android   для подмножества элементов интерфейса :

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

Button Заметно отсутствует . Похоже, что мы должны ждать, пока будущие обновления .

2eluleci @

Так что AppCompat браузер не поддерживает кнопку еще можно использовать XML в качестве фона . Для этого, я взглянул на исходном коде Android и нашли соответствующие файлы для укладки материала кнопки.

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

Обратите внимание на https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_material.xml ,

Вы можете скопировать этот файл в своих проектах папок холст - v21 . Но не трогайте цвета Attr здесь. Файл, который вы должны изменить этовторой файл .

холст - 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

Как вы понимаете, этоформа используется внутри этого чтобы сместить которые вы можете найти в 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

И в этом файле вы есть некоторые размеры, используемые в файле https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/dimens_material.xml, Вы можете скопировать весь файл и поместите в папку ценностей. Это важно для применения один и тот же размер ( который используется в материальных кнопок ) для всех кнопок

4 - Create another drawable file for old versions

В предыдущих версиях вы должны иметь другой холст с таким же именем . Я прямо поставив элементы инлайн вместо ссылки . Вы можете ссылаться на них . Но, опять же ,самое главное, оригинальные размеры кнопки материала .

холст / 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

Ваша кнопка будет иметь волновой эффект на Lollipop устройств. Старые версии будут иметь точно такие же кнопки, кроме волнового эффекта . Но так, что вы предоставляете вводимого коэффициента для разных государствах, они также реагируют на события прикосновения (как старому ) .

3kiruwka @

Если вы хотите " Flat" кнопку материальную только, вы можете настроить их фон, используя http://developer.android.com/reference/android/R.attr.html#selectableItemBackground атрибут, как описано http://stackoverflow.com/a/ 27932664/2358786 .