Как установить отключенный цвет кнопки с помощью AppCompat?
Я использую этот стиль, чтобы изменить цвет фона моей 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"/>
Оно работает. Но когда я вызываю setEnabled(false)
для этой Button
, она сохраняет тот же цвет. Как я могу справиться с этим делом?
Ответы
Ответ 1
Вы не используете стиль 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"/>
Как упоминалось в этом ответе на использование стиля Widget.AppCompat.Button.Colored
, отключенный цвет управляется colorButtonNormal
, а цвет включенным - colorAccent
. Используя ThemeOverlay.AppCompat.Dark
, textColor
автоматически изменяется на темное, что означает, что вам может не понадобиться пользовательский ThemeOverlay
вообще.
Ответ 2
Объединяя принятое решение с пользовательским виджетами, у нас может быть кнопка, которая отключается установкой альфы. Это должно работать для любой комбинации кнопок и текста:
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);
}
}
Ответ 3
вместо того, чтобы использовать цвет для вашей кнопки, вы должны использовать фон с селекторами. Вот демонстрационный код
<?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>
Ответ 4
Когда вы изменили программно, вам нужно действовать таким образом:
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);
Ответ 5
В настоящее время я использую следующие настройки для 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" />
Ответ 6
Полное решение, основанное на комментариях ianhanniballake "ответ и Джо Боубер ":
/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"/>
Это сработало очень хорошо для меня
Ответ 7
Реализация @meanman в Kotlin, приведенном выше, регулировка альфа - самый простой способ, и все мои эффекты пульсации касания все еще работают как прежде:
import android.content.Context
import android.support.v7.widget.AppCompatButton
import android.util.AttributeSet
class FadedDisableButton : AppCompatButton {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun setEnabled(enabled: Boolean) {
alpha = when {
enabled -> 1.0f
else -> 0.5f
}
super.setEnabled(enabled)
}
}