Почему setEnabled (false) не вызывает ColorStateList для темы Theme.AppCompat.Light? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь использовать setEnabled(false) на Button, чтобы показать серое отключенное состояние ...

  • Я могу получить желаемый результат, только если нажать кнопку на кнопке

    android:theme="@style/Button"
    

    , а затем измените родительский элемент в этом стиле кнопок на что-то отличное от Theme.AppCompat.Light.DarkActionBar, например, из Материал:

    <style name="Button" parent="android:Theme.Material.Light.NoActionBar">
    

    (даже в этом случае изменяется только фон кнопки, цвет текста - нет.)

  • I не может видеть кнопку серой, если она отключена, если я оставлю кнопку, чтобы принять значения по умолчанию (Насколько я понимаю, при использовании Theme.AppCompat., Button становится AppCompat.Widget.Button и наследует ColorStateList.)

По моему res\values\styles.xml

    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>        
        <!-- only way I could get this to work -->
        <style name="Button" parent="android:Theme.Material.Light.NoActionBar">
            <!--<item name="colorAccent">@color/butt</item>-->
            <!--<item name="colorButtonNormal">@color/butt</item>-->
        </style>        
        <style name="AppTheme.NoActionBar">
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
        </style>        
        <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
        <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
    </resources>

В AndroidManifest.xml

    <application
    android:theme="@style/AppTheme"

    ( and nothing under <activity> )

Мой MainActivity расширяется Activity

  • но я также пробовал extends AppCompatActivity и у меня была та же проблема.

Так что здесь происходит? Почему по умолчанию не работает «отключенная кнопка»?

  • , если я наследую от темы Material (как указано выше), почему цвет текста кнопки не изменяется? В основном, почему кнопки не выглядят так, как в редакторе темы ?)

Также

  • когда я задаю пользовательский ColorStateList через res\color, почему я не могу переопределить только некоторые состояния? Я пытался иметь только

    <item android:state_enabled="false" android:color="#616161" />
    

    Но это не сработало. Я смог получить серую кнопку отключения с помощью этого метода, только если указал больше <item> с, хотя мне все равно совпадать с другими состояниями. Это работает только если я добавлю что-то вроде:

    <!-- disabled state -->
    <item android:state_enabled="false" android:color="#616161" />    
    <!-- enabled state -->
    <item android:state_enabled="true" android:color="@color/colorPrimaryLighter" />    
    <!-- default -->
    <item android:color="#ffffff"/>
    

Мой supportLibraryVersion = '27.1.1'

я уже видел

Как настроить отключенный цвет кнопки с помощью AppCompat?

Widget.AppCompat. Цвет кнопкиButtonNormal показывает серый

Состояние списка для рисования и отключенное состояние

Android - стиль кнопки по умолчанию

Android: изменить цвет отключенного текста с помощью темы / стиля?

Когда следует использовать Theme.AppCompat против ThemeOverlay.AppCompat?

Использовать android: theme и ThemeOverlay для конкретных представлений темы и их потомков Pro-tip от + Ian Lake

и Вложенные темы Android

Я не хочу отменять значения по умолчанию, если мне не нужно, и указывать то, что мне не нужно. Заранее спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Позвольте мне подробнее остановиться на некоторых из ваших вопросов:

Активация кнопок материала по умолчанию:

Примечание: в целом, я думаю, это приводит к более согласованному виду и поведению при использовании темы AppCompat, в которой также используется AppCompatActivity и т. Д.

Но, как вы заметили, просто используя тему AppCompat, Button (внутренне сопоставленный с android.support.v7.widget.AppCompatButton) не применяет автоматически стиль материала совместимости.

Я не уверен, является ли это ошибкой, но я подозреваю, что это делает взгляд обратно совместимым. Вы можете легко активировать его, применяя правильный стиль прямо на виде:

<Button
   style="@style/Widget.AppCompat.Button.Colored"
   ... />

Вот скриншот, демонстрирующий различный вид включенных и отключенных кнопок. Стилизованные кнопки - первые две. Активный имеет розовый цвет акцента в качестве фона. Старая кнопка Android - это две нижние. Как вы можете видеть, отключение изменяет только цвет текста и немного контур.

Buttons in different styles

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

Это приведет к отключению такой кнопки: Disabled with alpha accent color

Опять же, вы можете применить этот стиль, как указано выше для каждой кнопки или всего в вашем 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-студии иногда неправильно отображаются элементы, особенно при применении пользовательской темы к элементу! Лучше тестировать в эмуляторе или на реальном устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...