2016-03-05 19 views
19

Io uso questo stile cambiare sfondo colore della mia Button:Come configurare il colore disabilitato del pulsante con AppCompat?

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

E in disposizione:

<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"/> 

Funziona. Ma quando chiamo setEnabled(false) su questo Button, mantiene lo stesso colore. Come posso gestire questo caso?

risposta

49

non si utilizza correttamente lo stile Widget.AppCompat.Button.Colored . Stai utilizzando uno stile genitore (Widget.AppCompat.Button.Colored), ma applicandolo come tema. Ciò significa in effetti che la parte Widget.AppCompat.Button.Colored viene ignorata completamente e invece si modifica semplicemente il colore predefinito del pulsante (che funziona, ma non gestisce il caso disabilitato).

Invece, è necessario utilizzare un ThemeOverlay e applicare lo stile Colored separatamente:

<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"/> 

Come accennato nella this answer on using the Widget.AppCompat.Button.Colored style, il colore disabile è controllata dal colorButtonNormal e il colore abilitato è controllato da colorAccent. Usando lo ThemeOverlay.AppCompat.Dark, lo textColor viene automaticamente modificato in scuro, il che significa che potrebbe non essere necessario il custom ThemeOverlay.

+0

personalizzato 'ThemeOverlay.AppCompat.Light' chiamato' AccentButton' è il modo più chiaro per me. Con un solo 'colorButtonNormal' sembra proprio che' accentColor' sia mischiato al bianco quando 'Button' è disabilitato. Grazie! – Alexandr

+0

Invece di applicare lo stile colorato separatamente, una semplificazione è spostare questa dichiarazione di stile nel tema AccentButton: definendolo come buttonStyle del tema. In questo modo, è necessario aggiungere un solo attributo aggiuntivo a ciascuna dichiarazione di pulsante. –

+0

@JoeBowbeer - come menzionato nel [Scelta di un post di blog stile pulsante] (https://medium.com/google-developers/choosing-a-button-style-with-purpose-and-intent-35a945e228d3), colorato in rilievo i pulsanti non dovrebbero essere necessariamente la norma durante l'intero tema, quindi impostarlo come pulsante 'baseTheme' è forse un po 'troppo. – ianhanniballake

1

anziché utilizzare il colore per il pulsante, è necessario utilizzare uno sfondo con selettori. Ecco il codice demo

<?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

Dopo aver modificato programatically è necessario agire in questo modo:

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

O

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

Combinando la soluzione accettata con un widget personalizzato possiamo avere un pulsante che appare disabilitato impostando l'alfa. Questo dovrebbe funzionare per qualsiasi combinazione di pulsanti e il testo di colore:

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

L'impostazione di alfa è la strada da percorrere. – VSG24

1

Attualmente, io uso le seguenti impostazioni per l'API Android 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> 

e

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

soluzione completa che si estende dal ianhanniballake 'di risposta e Joe Bowbeer 'commento:

/res/valori/stili.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> 

E dovunque si utilizza il pulsante:

<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"/> 

che ha lavorato davvero bello per me

Problemi correlati