Bagaimana cara mengubah tombol menjadi abu-abu?

103

Saya memiliki tombol yang ditentukan seperti yang ditunjukkan di bawah ini. Ketika saya ingin menonaktifkannya, saya menggunakan my_btn.setEnabled(false), tetapi saya juga ingin membuatnya menjadi abu-abu. Bagaimana saya bisa melakukan itu?

Terima kasih

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

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

drawable / 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>
jul
sumber

Jawaban:

57

Anda harus memberikan 3 atau 4 status di Anda btn_defaut.xmlsebagai pemilih.

  1. Keadaan ditekan
  2. Keadaan default
  3. Status fokus
  4. Status diaktifkan (Nonaktifkan negara dengan indikasi palsu; lihat komentar)

Anda akan memberikan efek dan latar belakang untuk negara bagian yang sesuai.

Berikut pembahasan detailnya: Tombol Android Standar dengan warna berbeda

Adil Soomro
sumber
Jadi untuk membuatnya menjadi abu-abu, saya harus mengubah warna latar belakang DAN warna teks dalam keadaan nonaktif? Tidak ada cara untuk menambahkan latar depan transparan?
Juli
3
Ya! apa yang akan Anda sediakan untuk android:state_disable="true"itu akan menunjukkan status ketika Tombol dinonaktifkan, cara yang mudah dan direkomendasikan.
Adil Soomro
dan di mana saya dapat menentukan warna teks untuk status nonaktif? Tampaknya hanya latar belakang yang dapat ditentukan ... Saya mengajukan pertanyaan baru untuk itu: stackoverflow.com/questions/8743584/…
jul
17
Tidak ada android:state_disable="true", bukan? Apakah yang Anda maksud android:state_enabled="false"?
gak
@MarcoW .: ya, Anda benar sekali. Permintaan maaf untuk atribut yang salah.
Adil Soomro
171

Anda juga dapat membuatnya tampak tidak aktif dengan menyetel alfa (menjadikannya semi-transparan). Ini sangat berguna jika latar belakang tombol Anda adalah gambar, dan Anda tidak ingin membuat status untuknya.

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

memperbarui: Saya menulis solusi di atas sebelum Kotlin dan ketika saya masih pemula. Ini lebih merupakan solusi yang "cepat", tetapi saya tidak merekomendasikannya dalam lingkungan profesional.

Hari ini, jika saya menginginkan solusi umum yang berfungsi pada tombol / tampilan apa pun tanpa harus membuat daftar status, saya akan membuat ekstensi Kotlin.

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

Di Java, Anda dapat melakukan sesuatu yang mirip dengan fungsi util statis dan Anda hanya perlu meneruskan tampilan sebagai variabel. Ini tidak sebersih tapi berhasil.

Siavash
sumber
4
Saya telah membaca bahwa panggilan ke setAlpha mahal pada CPU. Adakah yang bisa mengkonfirmasi?
Ali Kazi
@AliKazi itu tergantung pada jenis Anda View. Dari pos G + ini : "Jika Tampilan Anda tidak berisi perintah menggambar yang tumpang tindih, setAlpha()dioptimalkan dan kami cukup memodifikasi objek Paint untuk menerapkan alfa yang tepat. Ini terjadi ketika View.hasOverlappingRendering()mengembalikan nilai true. ImageViewS dan TextViews tanpa drawable latar belakang adalah kandidat umum untuk ini optimasi. Jika Anda berada dalam situasi ini, gunakan setAlpha()sebanyak yang Anda inginkan. ".
Sufian
1
@SuaraMaaf. Tetapi untuk berada di sisi yang lebih aman, saya mengandalkan StateListDrawable sederhana untuk setiap tombol. Bagaimana saya melakukannya, saya telah memposting sebagai jawaban baru. Saya telah menyertakan tautan ke tempat saya mengetahui bahwa alfa buruk untuk kinerja.
Ali Kazi
Visual user-ramah
Farid
yang benar-benar menonaktifkan tampilan secara visual. terima kasih @Siavash
Akash Bisariya
54

Solusi paling mudah adalah menyetel filter warna ke gambar latar belakang tombol seperti yang saya lihat di sini

Anda dapat melakukan sebagai berikut:

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

Semoga saya membantu seseorang ...

Woody
sumber
Saya paling suka pendekatan ini. Terima kasih!
nab
2
Pendekatan ini memiliki potensi, tetapi warna yang dihasilkan tidak selalu seperti yang Anda pikirkan. Misalnya, tombol Oranye dengan warna Abu-abu yang dikalikan menghasilkan warna merah tua - bukan oranye pudar.
Seseorang di suatu tempat
4
mungkin Mode.SRC_INharus digunakan sebagai pengganti Multiply. Lihat stackoverflow.com/a/17112876/550471
Someone Somewhere
Ini berfungsi, tetapi dua warna ketika dicampur berubah menjadi warna lain
Shamsul Arefin Sajib
Hebat! begitu bersih.
Milind Chaudhary
21

Semua jawaban yang diberikan berfungsi dengan baik, tetapi saya ingat belajar bahwa menggunakan setAlpha bisa menjadi kinerja ide yang buruk (info lebih lanjut di sini ). Jadi, membuat StateListDrawable adalah ide yang lebih baik untuk mengelola status tombol yang dinonaktifkan. Begini caranya:

Buat XML btn_blue.xml di folder res / drawable:

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

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

Buat gaya tombol di 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>

Kemudian terapkan gaya ini ke tombol Anda:

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

Sekarang ketika Anda memanggil btnBlue.setEnabled(true)ATAU btnBlue.setEnabled(false)warna negara akan secara otomatis beralih.

Ali Kazi
sumber
12

Setel Clickable sebagai false dan ubah warna backgroung sebagai:

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

Anda harus membuat file XML untuk tombol yang dinonaktifkan ( drawable / btn_disable.xml )

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

Dan buat selektor untuk tombol ( 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>

Tambahkan selektor ke tombol Anda

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>
Willy Chen
sumber
2
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
Leon van Noord
sumber
13
Itu tidak menjawab pertanyaan itu.
Katalis Kualitas
1

Saya menggunakan kode ini untuk itu:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);
Dominik
sumber
0

Saya mencoba solusi di atas tetapi tidak satupun yang berhasil untuk saya. Saya pergi dengan opsi berikut:

<!-- 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"
                .../>
André Ramon
sumber