Как сделать кнопку серой?

103

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

Спасибо

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

стиль / srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

вытяжка / btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>
июл
источник
2
используйте селектор stackoverflow.com/questions/7335345/button-background-selector
Буда Гаврил

Ответы:

57

Вы должны указать 3 или 4 состояния в своем btn_defaut.xmlселекторе.

  1. Сжатое состояние
  2. Состояние по умолчанию
  3. Состояние фокуса
  4. Включенное состояние (отключенное состояние с ложной индикацией; см. Комментарии)

Вы соответственно создадите эффект и фон для состояний.

Вот подробное обсуждение: Стандартная кнопка Android с другим цветом

Адиль Соомро
источник
Итак, чтобы сделать его серым, я должен изменить цвет фона И цвет текста в отключенном состоянии? Нет возможности просто добавить прозрачный передний план?
июля
3
Да! то, что вы предоставите, android:state_disable="true"будет показывать состояние, когда кнопка отключена, простой и рекомендуемый способ.
Адиль Соомро 05
а где я могу указать цвет текста для отключенного состояния? Кажется, что можно указать только фон ... Я задал для этого новый вопрос: stackoverflow.com/questions/8743584/…
июл
17
Нет, не так android:state_disable="true"ли? Вы имеете в виду android:state_enabled="false"?
caw
@MarcoW .: да, вы абсолютно правы. Приносим извинения за неправильный атрибут.
Adil Soomro
173

Вы также можете сделать его отключенным, установив альфа-канал (сделав его полупрозрачным). Это особенно полезно, если фон вашей кнопки является изображением, и вы не хотите создавать для него состояния.

button.setAlpha(.5f);
button.setClickable(false);

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

Сегодня, если бы мне нужно было универсальное решение, которое работало бы с любой кнопкой / представлением без необходимости создавать список состояний, я бы создал расширение Kotlin.

fun View.disable() {
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)
}

В Java вы можете сделать что-то подобное со статической функцией util, и вам просто нужно будет передать представление как переменную. Это не так чисто, но работает.

Сиаваш
источник
4
Я читал, что вызовы setAlpha дорого обходятся ЦП. Кто-нибудь может подтвердить?
Али Кази
@AliKazi это зависит от типа вашего View. Из этого сообщения G + : «Если ваше представление не содержит перекрывающихся команд рисования, setAlpha()оно оптимизировано, и мы просто изменяем объекты Paint, чтобы применить правильную альфа-канал. Это происходит, когда View.hasOverlappingRendering()возвращается true. ImageViewS и TextViews без возможности рисования фона являются общими кандидатами на это оптимизация. Если вы попали в такую ​​ситуацию, используйте setAlpha()столько, сколько хотите. ».
Sufian
1
@Sufian Спасибо. Но чтобы быть в безопасности, я полагался на простой StateListDrawable для каждой кнопки. Как я это сделал, я опубликовал новый ответ. Я включил ссылки на то, где узнал, что альфа плохо сказывается на производительности.
Али Кази
Визуально недружелюбный к пользователю
Фарид
которые фактически визуально отключают вид. спасибо @Siavash
Akash Bisariya
54

Самое простое решение - установить цветовой фильтр на фоновое изображение кнопки, как я видел здесь.

Вы можете сделать следующее:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

Надеюсь, я кому-то помог ...

Вуди
источник
Мне больше всего нравится такой подход. Спасибо!
nab
2
У этого подхода есть потенциал, но получаемый цвет не всегда такой, как вы думаете. Например, оранжевая кнопка с умноженным серым цветом дает темно-красный цвет, а не блеклый оранжевый.
Someone Somewhere
4
возможно, Mode.SRC_INследует использовать вместо Multiply. См. Stackoverflow.com/a/17112876/550471
Someone Somewhere
Это работает, но два цвета при смешивании превращаются в другой цвет
Шамсул Арефин Саджиб
Потрясающие! так чисто.
Милинд Чаудхари
22

Все предоставленные ответы работают нормально, но я помню, как узнал, что использование setAlpha может быть плохой идеей с точки зрения производительности (подробнее здесь ). Поэтому создание StateListDrawable - лучшая идея для управления отключенным состоянием кнопок. Вот как:

Создайте XML btn_blue.xml в папке res / drawable:

<!-- Disable background -->
<item android:state_enabled="false"
      android:color="@color/md_blue_200"/>

<!-- Enabled background -->
<item android:color="@color/md_blue_500"/>

Создайте стиль кнопки в res / values ​​/ styles.xml

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

Затем примените этот стиль к своей кнопке:

<Button
     android:id="@+id/my_disabled_button"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/BlueButton"/>

Теперь, когда вы вызываете btnBlue.setEnabled(true)ИЛИ, btnBlue.setEnabled(false)цвета состояния будут автоматически переключаться.

Али Кази
источник
13

Вы должны создать XML-файл для отключенной кнопки ( drawable / btn_disable.xml )

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

И создайте селектор для кнопки ( drawable / btn_selector.xml )

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" />

</selector>

Добавьте селектор на свою кнопку

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>
Вилли Чен
источник
12

Установите Clickable как false и измените цвет фона как:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));
Сати
источник
2
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
Леон ван Норд
источник
14
Это не отвечает на вопрос.
Quality Catalyst
1

Я использовал для этого этот код:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);
Доминик
источник
0

Я пробовал вышеуказанные решения, но ни одно из них не помогло мне. Я выбрал следующий вариант:

<!-- button_color_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_enabled="true"/>
    <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
</selector>
<com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:backgroundTint="@color/button_color_selector"
                .../>
Андре Рамон
источник