Подтвердить что ты не робот

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

4b9b3361

Ответ 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)
    }
}