如何使用AppCompat设置button的禁用颜色?

我使用这种风格来改变我的Button 背景颜色:

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

有用。 但是,当我在这个Button上调用setEnabled(false)时,它保持相同的颜色。 我怎样才能pipe理这个案子?

Solutions Collecting From Web of "如何使用AppCompat设置button的禁用颜色?"

您没有正确使用Widget.AppCompat.Button.Colored样式。 您正在使用父级样式( Widget.AppCompat.Button.Colored ),但将其用作主题。 这实际上意味着Widget.AppCompat.Button.Colored部分被完全忽略,而只是改变了button的默认颜色(工作,但不处理禁用的情况)。

相反,您应该使用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"/> 

正如在使用Widget.AppCompat.Button.Colored样式的回答中所提到的,禁用的颜色由colorButtonNormal控制,启用的颜色由colorAccent控制。 通过使用ThemeOverlay.AppCompat.DarktextColor会自动更改为黑暗,这意味着您可能根本不需要自定义ThemeOverlay

将接受的解决scheme与自定义小部件相结合,我们可以通过设置alpha来显示禁用的button。 这应该适用于任何button和文本颜色组合:

 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); } } 

当你编程改变时,你需要这样做:

 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); 

而不是使用你的button的颜色,你应该使用select器的背景。 这里是演示代码

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

目前,我使用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" />