2016-03-05 2 views
19

Я использую этот стиль изменить фона цвета моей Button:Как настроить отключенный цвет кнопки с помощью AppCompat?

<style name="AccentButton" parent="Widget.AppCompat.Button.Colored"> 
    <item name="colorButtonNormal">@color/colorAccent</item> 
    <item name="android:textColor">@color/white</item> 
</style> 

И в раскладка:

<Button 
     android:id="@+id/login_button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/fragment_login_login_button" 
     app:theme="@style/AccentButton"/> 

Он работает. Но когда я звоню setEnabled(false) на этом Button, он сохраняет тот же цвет. Как я могу управлять этим случаем?

ответ

49

Вы не используете Widget.AppCompat.Button.Colored стиль правильно , Вы используете родительский стиль (Widget.AppCompat.Button.Colored), но применяете его как тему. Это фактически означает, что часть Widget.AppCompat.Button.Colored игнорируется полностью, и вместо этого вы просто меняете цвет кнопки по умолчанию (который работает, но не обрабатывает отключенный случай).

Вместо этого, вы должны использовать ThemeOverlay и применять Colored стиль отдельно:

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Dark"> 
    <!-- customize colorButtonNormal for the disable color --> 
    <!-- customize colorAccent for the enabled color --> 
</style> 

<Button 
    android:id="@+id/login_button" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/fragment_login_login_button" 
    android:theme="@style/AccentButton" 
    style="@style/Widget.AppCompat.Button.Colored"/> 

Как уже упоминалось в this answer on using the Widget.AppCompat.Button.Colored style, инвалидов цвет управляется colorButtonNormal и поддержкой цвета контролируется colorAccent. Используя ThemeOverlay.AppCompat.Dark, textColor автоматически заменяется на темный, что означает, что вам может не понадобиться пользовательский ThemeOverlay.

+0

Настраиваемый 'ThemeOverlay.AppCompat.Light' именем' AccentButton' является самым ясным образом для меня. При использовании только одного 'colorButtonNormal' он выглядит правильно, поскольку' accentColor' смешивается с белым, когда 'Button' отключен. Благодаря! – Alexandr

+0

Вместо того, чтобы применять стиль «Цвет» отдельно, упрощение состоит в том, чтобы переместить это объявление стиля в тему AccentButton: определяя его как buttonStyle темы. Таким образом, к каждому объявлению каждой кнопки нужно добавить только один дополнительный атрибут. –

+0

@JoeBowbeer - как упоминалось в блоге [Выбор записи в стиле Button Button] (https://medium.com/google-developers/choosing-a-button-style-with-purpose-and-intent-35a945e228d3), поднятый цветной кнопки не обязательно должны быть нормой во всей вашей теме, поэтому установка его как основы 'buttonTheme', возможно, немного. – ianhanniballake

1

Вместо того, чтобы использовать цвет для вашей кнопки, вы должны использовать фон с селекторами. Вот демонстрационный код

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="true"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/yourEnabledColor" /> 
     </shape> 
    </item> 
    <item android:state_enabled="false"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/yourDisabledColor" /> 
     </shape> 
    </item> 
</selector> 
3

Когда вы изменили программно вы должны действовать таким образом:

button = new Button(new ContextThemeWrapper(ActiVityName.this, R.style.AccentButton)); 

ИЛИ

if (button.isEnabled()) 
    button.getBackground().setColorFilter(Color.Black, PorterDuff.Mode.MULTIPLY); 
else 
    button.getBackground().setColorFilter(null); 
6

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

public class ButtonWidget extends AppCompatButton { 

    public ButtonWidget(Context context) { 
     super(context); 
    } 

    public ButtonWidget(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ButtonWidget(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void setEnabled(boolean enabled) { 
     setAlpha(enabled ? 1 : 0.5f); 
     super.setEnabled(enabled); 
    } 

} 
+0

Настройка альфы - это путь. – VSG24

1

В настоящее время я использую следующие настройки для Android API 15+.

/res/color/btn_text_color.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="#42000000" android:state_enabled="false" /> 
    <item android:color="#ffffff" /> 
</selector> 

/res/values/styles.xml

<style name="ColoredButton" parent="Widget.AppCompat.Button.Colored"> 
    <item name="android:textColor">@color/btn_text_color</item> 
</style> 

и

<Button 
    android:id="@+id/button" 
    style="@style/ColoredButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="button" /> 
0

Комплексное решение простирающийся от ianhanniballake "ответа и Joe Bowbeer 'комментарий:

/res/values ​​/ styles.XML

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Dark"> 
    <!-- customize colorAccent for the enabled color --> 
    <!-- customize colorControlHighlight for the enabled/pressed color --> 
    <!-- customize colorButtonNormal for the disabled color --> 
    <item name="android:buttonStyle">@style/Widget.AppCompat.Button.Colored</item> 
</style> 

И где бы вы ни с помощью кнопки:

<Button 
    android:id="@+id/login_button" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/fragment_login_login_button" 
    android:theme="@style/AccentButton"/> 

, который работал очень хорошо для меня

Смежные вопросы