Как сделать кнопку серым? - PullRequest
       3

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

90 голосов
/ 05 января 2012

У меня есть кнопка, определенная как показано ниже. Когда я хочу отключить его, я использую 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>

Ответы [ 9 ]

144 голосов
/ 25 ноября 2014

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

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

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

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

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

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

53 голосов
/ 05 января 2012

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

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

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

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

48 голосов
/ 29 сентября 2013

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

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

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

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

12 голосов
/ 27 июня 2016

Все приведенные ответы работают нормально, но я помню, как узнал, что использование 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), цвета состояний автоматически переключаются.

11 голосов
/ 08 декабря 2016

Вы должны создать файл 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>
11 голосов
/ 28 августа 2013

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

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));
4 голосов
/ 05 января 2012
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
1 голос
/ 03 октября 2018

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

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);
0 голосов
/ 14 декабря 2016

Вы можете сделать серую картинку, вставить ее в свой чертеж и добавить ее в свой код.

button.setBackgroundResource(R.drawable.grey);

легко, просто, но из-за использования картинки становится немного больше места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...