Як сірувати кнопку?


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>

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

Відповіді:


57

Ви повинні вказати 3 або 4 штати у своєму btn_defaut.xmlселекторі.

  1. Держава, що пресується
  2. Стан за замовчуванням
  3. Фокусний стан
  4. Увімкнено стан (вимкнути стан з помилковою вказівкою; див. Коментарі)

Ви відповідно забезпечите ефект та передумови для штатів.

Ось детальна дискусія: Стандартна кнопка Android з іншим кольором


Тож для того, щоб вимкнути його, я повинен змінити колір фону І колір тексту у відключеному стані? Немає можливості просто додати прозорий передній план?
липень

3
Так! що ви надасте для android:state_disable="true"цього, покаже стан, коли кнопка відключена, простий та рекомендований спосіб.
Аділ Соомро

і де я можу вказати колір тексту для відключеного стану? Здається , що тільки фон може бути визначений ... Я задав нове питання для цього: stackoverflow.com/questions/8743584 / ...
Юль

17
Немає android:state_disable="true", є? Ви маєте на увазі android:state_enabled="false"?
каре

@MarcoW .: так, ви абсолютно праві. Вибачте за неправильний атрибут.
Аділ Соомро

171

Ви також можете зробити його вимкненим, встановивши альфа (роблячи його напівпрозорим). Це особливо корисно, якщо фоном вашої кнопки є зображення, і ви не хочете створювати для нього стани.

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

оновлення: я писав вищезазначене рішення до Котліна і коли я був новобранцем. Це скоріше швидке рішення, але я не рекомендую його в професійному середовищі.

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

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

У Java ви можете зробити щось подібне зі статичною функцією утиліти, і вам просто доведеться перейти в подання як змінну. Це не так чисто, але це працює.


4
Я читав, що дзвінки до setAlpha дорогі на процесорі. Чи може хтось підтвердити?
Алі Казі

@AliKazi це залежить від типу вашого View. Від цього G + пост : «Якщо подання не містить перекриваються команд малювання, setAlpha()оптимізований геть , і ми просто змінити Фарба об'єктів для застосування правильного альфа Це відбувається , коли. View.hasOverlappingRendering()Повертає істину. ImageViewS і TextViewS, без фону Drawable є загальними кандидатами на цей оптимізація. Якщо ви опинилися в цій ситуації, використовуйте setAlpha()стільки, скільки хочете. "
Суфіан

1
@ Суфіан Дякую Але щоб бути більш безпечним, я покладався на просту StateListDravable для кожної кнопки. Як я це зробив, я опублікував як нову відповідь. Я включив посилання на те, де я дізнався, що альфа погана для продуктивності.
Алі Казі

Візуально непривітний для користувачів
Farid

які насправді візуально відключають подання. дякую @Siavash
Акаш Бісарія,

54

Найпростіше рішення - встановити кольоровий фільтр на фонове зображення кнопки, як я бачив тут

Можна зробити так:

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

Сподіваюся, я комусь допоміг ...


Мені найбільше подобається такий підхід. Дякую!
nab

2
Цей підхід має потенціал, але отриманий колір не завжди є таким, як ви думаєте, що це буде. Наприклад, помаранчева кнопка з множиною сірого кольору призводить до темно-червоного кольору, а не до вицвілого оранжевого.
Хтось десь

4
можливо, Mode.SRC_INслід використовувати замість множення. Дивіться stackoverflow.com/a/17112876/550471
Хтось десь

Це працює, але два кольори, коли змішане, перетворюється на інший колір
Шамсул Арефін Саджіб

Дивовижно! такий чистий.
Milind Chaudhary

21

Усі наведені відповіді спрацьовують добре, але я пам’ятаю, що дізнавшись, що використання setAlpha може бути поганою ідеєю продуктивності (більше інформації тут ). Тож створення StateListDravable - краща ідея для керування відключеним станом кнопок. Ось як:

Створіть XML btn_blue.xml у папці res / dravable:

<!-- 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)кольори стану автоматично перемикаються.


12

Встановіть Clickable як хибний та змініть колір фону як:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

12

Ви повинні створити XML-файл для відключеної кнопки ( dravable / btn_disable.xml )

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

І створіть селектор для кнопки ( Dravable / 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>


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"
                .../>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.