Подтвердить что ты не робот

Lollipop: кнопка "Отключено" → какой стиль?

Я попытался отследить, как Lollipop отображает кнопку, которая отключена с помощью android:enabled="false" в файле макета.

Холо

С Holo, это легко: в styles_holo.xml я нахожу стиль Widget.Holo.Button, который дает мне ссылку на @drawable/btn_default_holo_dark. Там я нахожу селектор:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="@drawable/btn_default_normal_holo_dark" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="@drawable/btn_default_disabled_holo_dark" />
<item android:state_pressed="true"
android:drawable="@drawable/btn_default_pressed_holo_dark" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/btn_default_focused_holo_dark" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_default_normal_holo_dark" />
<item android:state_focused="true"
android:drawable="@drawable/btn_default_disabled_focused_holo_dark" />
<item
android:drawable="@drawable/btn_default_disabled_holo_dark" />
</selector>

Lollipop

Когда я пытаюсь применить ту же логику к Lollipop, я застрял:

В styles_material.xml Я нахожу стиль <style name="Widget.Material.Button">, где я нахожу ссылку на <item name="background">@drawable/btn_default_material</item>. Но нет селектора??!! Вместо этого я нахожу:

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

Может кто-нибудь объяснить, какой особый стиль Lollipop использует для отключенной кнопки. Большое спасибо!

Изменить

Я могу частично ответить на вопрос: В @drawable/btn_default_mtrl_shape я нахожу ссылку на <solid android:color="?attr/colorButtonNormal" />, которая, в свою очередь, указывает на @color/btn_default_material_light, которая включает селектор:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="@dimen/disabled_alpha_material_light"
android:color="@color/button_material_light"/>
<item android:color="@color/button_material_light"/>
</selector>

Но это значение альфа объясняет только половину этого. Как-то Lollipop также установил высоту до 0?

4b9b3361

Ответ 1

Вот как я решил это, благодаря вашему частичному ответу.

Сначала: добавьте новую папку "цвет" в папку "res", если она не существует. enter image description here

Добавьте новый .xml файл в папку "color" (я буду называть этот файл ButtonColorSelector.xml), где мы создадим новый ColorStateList следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#F2F2F2"/> <!-- disabled -->
    <item android:state_pressed="true" android:color="#FF0000"/> <!-- pressed -->
    <item android:state_focused="true" android:color="#FF0000"/> <!-- focused -->
    <item android:color="#0000FF"/> <!-- default -->
</selector>

Во-вторых: добавьте этот файл .xml с эффектом пульсации, который вы упомянули, под папкой "drawable" и ссылайтесь на свой цветSelector вместо btn_default_mtrl_shape. Я буду называть этот файл RaisedButton.xml.

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item>
        <shape>
            <solid android:color="@color/buttoncolorselector"/>
            <corners android:radius="5dp" />
        </shape>
    </item>
</ripple>

В-третьих: теперь вы можете использовать свой шаблон для фона кнопки в своих макетах, например:

<Button
    android:background="@drawable/raisedbutton"
    android:text="@string/SomeButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="DoStuffitto"
    android:enabled="false"
    android:id="@+id/someButton" />