Позвольте мне подробнее остановиться на некоторых из ваших вопросов:
Активация кнопок материала по умолчанию:
Примечание: в целом, я думаю, это приводит к более согласованному виду и поведению при использовании темы AppCompat, в которой также используется AppCompatActivity
и т. Д.
Но, как вы заметили, просто используя тему AppCompat
, Button
(внутренне сопоставленный с android.support.v7.widget.AppCompatButton
) не применяет автоматически стиль материала совместимости.
Я не уверен, является ли это ошибкой, но я подозреваю, что это делает взгляд обратно совместимым. Вы можете легко активировать его, применяя правильный стиль прямо на виде:
<Button
style="@style/Widget.AppCompat.Button.Colored"
... />
Вот скриншот, демонстрирующий различный вид включенных и отключенных кнопок.
Стилизованные кнопки - первые две. Активный имеет розовый цвет акцента в качестве фона.
Старая кнопка Android - это две нижние. Как вы можете видеть, отключение изменяет только цвет текста и немного контур.
Если вы хотите, чтобы это применялось к любой кнопке, которую вы используете в своем приложении, вы можете добавить следующую строку в AppTheme
:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="buttonStyle">@style/Widget.AppCompat.Button.Colored</item>
...
Это будет использовать ваш цветовой акцент по умолчанию в качестве цвета подсветки кнопки и серый оттенок в качестве плоской отключенной кнопки. Вы упомянули только определение android:theme
для вашего App
в вашем Манифесте. Чтобы это решение работало, вам может потребоваться установить тему для каждого Activity
.
Определение цвета с разными состояниями
Идея ColorStateList
состоит в том, чтобы определить цвет, который изменяется в зависимости от состояния View
. В качестве запасного варианта требуется случай по умолчанию, если условия конкретных определений не совпадают.
Ваш пример можно упростить до следующего:
<!-- disabled state -->
<item android:state_enabled="false" android:color="#616161" />
<!-- default = enabled state -->
<item android:color="@color/colorPrimaryLighter"/>
Для кнопок вы также можете использовать атрибут по умолчанию отключенный альфа , например. определить button_accent_stated
=
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?android:attr/disabledAlpha"
android:color="@color/colorAccent"/>
<item android:color="@color/colorAccent" />
</selector>
Индивидуальный цветовой стиль
Если вы довольны настройками по умолчанию, вы можете игнорировать следующую часть ...
Если вы хотите стилизовать кнопку (и то же самое для других компонентов) и придать ей нестандартные цвета, вам нужно иметь разницу между применением стилей и тем . Оба определены в styles.xml
, так что это может сбить с толку. Я могу рекомендовать дать определениям имена, которые представляют, как они используются.
Когда вы хотите перезаписать, например, цвет акцента, вы создаете custom ButtonTheme
и применяете его с android:theme
, как показано в вашем вопросе.
Если вы хотите настроить внешний вид компонента (например, с помощью кнопок материала, чтобы получить другой отключенный цвет), вы создаете custom ButtonStyle
и применяете его с помощью style
. Эти определения нуждаются в parent
, который соответствует View
.
С кнопками материалов и последними библиотеками поддержки предыдущий подход к установке отключенного цвета с помощью colorButtonNormal
, похоже, больше не работает. Вместо этого вы можете использовать цвет, определенный на предыдущем шаге, создав собственный стиль и установив его как backgroundTint
.
<style name="AppTheme.ButtonStyle" parent="@style/Widget.AppCompat.Button.Colored">
<item name="colorAccent">@color/colorAccent</item>
<item name="android:backgroundTint">@color/button_accent_stated</item>
</style>
Это приведет к отключению такой кнопки:
Опять же, вы можете применить этот стиль, как указано выше для каждой кнопки или всего в вашем AppTheme
Если вам по-прежнему требуется поддержка устройств, предшествующих леденцу на палочке, вам, вероятно, также понадобится настраиваемая тема для установки colorButtonNormal
.
Обновление: материал по умолчанию + указанный цвет текста:
Играл с моим примером приложения и единственным другим объяснением, которое я нашел, что мешает заданному по умолчанию цвету текста определять android:textColorPrimary
на вашем AppTheme
!
<item name="android:textColorPrimary">@color/colorPrimaryTextOnLight</item>
Если у вас есть все кнопки без специального цвета текста, этот текст будет использоваться для обоих состояний! См. Снимок экрана .
Если вы просто хотите исправить текст кнопки, чтобы изменить цвет, вы можете определить свой стиль кнопки следующим образом:
<style name="AppTheme.TextStatedButtonStyle" parent="@style/Widget.AppCompat.Button.Colored">
<item name="android:textColor">@color/button_text_stated</item>
</style>
С button_text_stated
таким селектором:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?android:disabledAlpha"
android:color="@color/colorPrimaryTextOnLight" />
<item android:color="@color/colorPrimaryTextOnDark" />
</selector>
И просто примените это buttonStyle
для всех кнопок или как style
для кнопки, как показано выше.
Я загрузил свой демонстрационный проект с большим количеством скриншотов / комбинаций настройки стилей и тем для Github, так как я чувствовал, что этот ответ становится слишком длинным, и лучше просто поиграть с ним, чтобы понять, как работают стили ,
Предварительный просмотр в Android studio
Как уже упоминалось в комментариях, я могу подтвердить, что в Preview в Android-студии иногда неправильно отображаются элементы, особенно при применении пользовательской темы к элементу! Лучше тестировать в эмуляторе или на реальном устройстве.