Bir düğme nasıl grileştirilir?


103

Aşağıda gösterildiği gibi bir düğmem var. Devre dışı bırakmak istediğimde kullanıyorum my_btn.setEnabled(false), ancak aynı zamanda gri renkte olmasını da istiyorum. Bunu nasıl yapabilirim?

Teşekkürler

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

Yanıtlar:


57

btn_defaut.xmlSeçici olarak 3 veya 4 durum sağlamalısınız .

  1. Basılmış durum
  2. Varsayılan durum
  3. Odak durumu
  4. Etkin durum (Yanlış gösterge ile durumu devre dışı bırakın; yorumlara bakın)

Buna göre, eyaletler için etki ve arka plan sağlayacaksınız.

İşte ayrıntılı bir tartışma: Farklı bir renge sahip Standart Android Düğmesi


Yani bunu grileştirmek için, devre dışı durumdaki arka planın rengini VE metnin rengini değiştirmeliyim? Şeffaf bir ön plan eklemenin bir yolu yok mu?
Temmuz

3
Evet! android:state_disable="true"bunun için ne sağlayacağınız, Düğme devre dışı bırakıldığında durumu, kolay ve önerilen yolu gösterecektir.
Adil Soomro

ve devre dışı bırakılmış durum için metin rengini nerede belirtebilirim? Görünüşe göre sadece bir arka plan belirtilebilir ... Bunun için yeni bir soru sordum: stackoverflow.com/questions/8743584/…
Tem

17
Yok android:state_disable="true", değil mi? Kastediyor musunuz android:state_enabled="false"?
2013

@MarcoW .: evet kesinlikle haklısınız. Yanlış özellik için özür dileriz.
Adil Soomro

173

Ayrıca alfayı ayarlayarak (yarı saydam yaparak) devre dışı görünmesini sağlayabilirsiniz. Bu, özellikle düğme arka planınız bir resimse ve bunun için durumlar oluşturmak istemiyorsanız kullanışlıdır.

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

güncelleme: Yukarıdaki çözümü Kotlin öncesi ve çaylakken yazdım. Daha çok "quick'n'dirty" çözümü, ancak profesyonel bir ortamda tavsiye etmiyorum.

Bugün, bir durum listesi oluşturmak zorunda kalmadan herhangi bir buton / görünüm üzerinde çalışan jenerik bir çözüm isteseydim, bir Kotlin uzantısı oluşturardım.

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

Java'da, statik bir kullanım işlevine benzer bir şey yapabilirsiniz ve yalnızca görünümü değişken olarak geçirmeniz gerekir. O kadar temiz değil ama işe yarıyor.


4
SetAlpha'ya yapılan çağrıların CPU için pahalı olduğunu okumuştum. Onaylayan var mı?
Ali Kazi

@AliKazi sizin türünüze bağlıdır View. Gönderen bu G + yazı : En Görünüm çizim komutlarını örtüşen içermiyorsa", setAlpha()uzak optimize edilmiş ve biz sadece Boya uygun alfa uygulamak nesneleri değiştirmek olan bu ne olur. View.hasOverlappingRendering()Döner gerçek. ImageViewLar ve TextViewherhangi bir arka plan çekilebilir ile s olan bu ortak adaylar optimizasyon. Bu durumdaysanız, setAlpha()istediğiniz kadar kullanın . "
Sufian

1
@Sufian Teşekkürler. Ancak daha güvenli olmak için, her düğme için basit bir StateListDrawable'a güveniyordum. Bunu nasıl yaptım, yeni bir cevap olarak gönderdim. Alfa'nın performans için kötü olduğunu öğrendiğim yerlere bağlantılar ekledim.
Ali Kazi

Görsel olarak kullanıcı dostu olmayan
Farid

görünümü görsel olarak devre dışı bırakır. teşekkürler @Siavash
Akash Bisariya

54

En kolay çözüm, burada gördüğüm gibi bir düğmenin arka plan görüntüsüne renk filtresi ayarlamaktır.

Aşağıdaki gibi yapabilirsiniz:

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

Umarım birine yardım ettim ...


Bu yaklaşımı en çok seviyorum. Teşekkürler!
yakalamak

2
Bu yaklaşımın potansiyeli vardır, ancak ortaya çıkan renk her zaman düşündüğünüz gibi değildir. Örneğin, Gri renk çarpılmış Turuncu düğme soluk turuncu değil koyu kırmızı renkle sonuçlanır.
Someone Somewhere

4
Mode.SRC_INÇarpma yerine belki kullanılmalıdır. Bkz. Stackoverflow.com/a/17112876/550471
Someone Somewhere

Bu işe yarıyor, ancak karıştırıldığında iki renk başka bir renge dönüşüyor
Shamsul Arefin Sajib

Harika! Çok temiz.
Milind Chaudhary

22

Verilen tüm cevaplar iyi çalışıyor, ancak setAlpha kullanmanın performans açısından kötü bir fikir olabileceğini öğrendiğimi hatırlıyorum (daha fazla bilgi burada ). Dolayısıyla, bir StateListDrawable oluşturmak , devre dışı bırakılmış düğmeler durumunu yönetmek için daha iyi bir fikirdir. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

Res / drawable klasöründe bir XML btn_blue.xml oluşturun:

<!-- 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'de bir düğme stili oluşturun

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

Ardından bu stili düğmenize uygulayın:

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

Şimdi btnBlue.setEnabled(true)OR'yi aradığınızda btnBlue.setEnabled(false), durum renkleri otomatik olarak değişecektir.


13

Devre dışı bırakılan düğme için bir XML dosyası oluşturmalısınız ( drawable / btn_disable.xml )

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

Ve düğme için bir seçici oluşturun ( 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>

Seçiciyi düğmenize ekleyin

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>

12

Tıklanabilir'i yanlış olarak ayarlayın ve arka plan rengini şu şekilde değiştirin:

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


1

Bu kodu bunun için kullandım:

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

0

Yukarıdaki çözümleri denedim ama hiçbiri benim için işe yaramadı. Şu seçenekle gittim:

<!-- 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"
                .../>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.