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?
Ответы
Ответ 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" />