2012-01-05 11 views
71

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

Teşekkür

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

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

çekilebilir/btn_default.xml Sen olarak btn_defaut.xml 3 veya 4 durumlarını sağlamak zorunda

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

http://stackoverflow.com/questions/7335345/button-background-selector –

cevap

44

bir Seçici.

  1. Sıkıştırılmış devlet
  2. Standart devlet
  3. Odak devlet
  4. Etkin devlet (yanlış endikasyon ile devlet devre dışı bırak; yorum görmek)

buna göre devletler için geçerli ve arka plan sağlayacaktır. Standard Android Button with a different color

+0

numaralı bir seçiciyi kullanın. Bu nedenle, gri tonlamak için arka plan rengini ve metnin rengini devre dışı bırakmak durumundayım. ? Şeffaf bir ön plan eklemenin bir yolu yok mu? – jul

+3

Yea! ne android için sağlayacaktır: state_disable = "true" 'Düğme devre dışı bırakıldığında durumu, kolay ve önerilen şekilde gösterecektir. –

+0

ve engellenen durumun metin rengini nerede belirleyebilirim? Sadece bir arka plan belirtilebilir gibi görünüyor ... Bunun için yeni bir soru sordum: http://stackoverflow.com/questions/8743584/how-to-set-the-text-style-of-a-button- in-seçiciler – jul

9
Button button = (Button)findViewById(R.id.buy_btn); 
button.setEnabled(false); 
+1

Bu soruya cevap vermiyor. –

9

Seti tıklanabilir olarak yanlış ve sıra backgroung rengini değiştirmek: Burada

detaylı tartışma

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

en kolay çözüm arka plan görüntüsüne renk filtresi ayarlamaktır

: Ben here

gördüğümüz gibi bir düğme Sen aşağıdaki gibi yapabilirsiniz Birisi yardım

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

Umut ... Sen de alfa (yarı-şeffaf hale) ayarlanarak devre dışı gibi görünmesine yol açabilir

+0

Bu yaklaşımı en çok beğeniyorum. Teşekkürler! – mtb

+1

Bu yaklaşımın potansiyeli vardır, ancak ortaya çıkan renk her zaman sizin düşündüğünüz gibi değildir. Örneğin, Gri rengi ile çarpılan bir Turuncu düğme koyu kırmızı renkte olur - soluk bir turuncu değil. –

+2

belki de Multiply yerine 'Mode.SRC_IN' kullanılmalıdır. Bkz. Http://stackoverflow.com/a/17112876/550471 –

96

. Bu, özellikle düğme arka planınız bir görüntü ise ve bunun için durumlar oluşturmak istemiyorsanız kullanışlıdır.

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

Hızlı, basit, performans dostu ve temiz olmayan bir çözüm. –

+4

SetAlpha çağrılarının CPU'da pahalı olduğunu okudum. Herkes onaylayabilir mi? –

+0

@AliKazi, 'View'unuzun türüne bağlıdır. [Bu G + yayını] 'ndan (https://plus.google.com/+CyrilMottier/posts/DuAZMhFPDjv): "Görünümünüzde çakışan çizim komutları yoksa" setAlpha() "en iyi duruma getirilir ve yalnızca Paint'i değiştiririz. Nesneleri uygun alfa uygular Bu, View.hasOverlappingRendering() 'i döndürdüğünde gerçekleşir.' ImageView's ve 'TextView' arka plan çekilemez, bu optimizasyon için ortak adaylar olur.Bu durumda iseniz, 'setAlpha kullanın() istediğiniz kadar. – Sufian

8

Tüm verilen cevaplar iyi çalışır, ancak setAlpha kullanarak akıllı bad idea performans (daha fazla bilgi here) olabileceğini öğrendiğimi hatırlıyorum. Bu nedenle, StateListDrawable'u oluşturmak, engellenmiş durumdaki düğmeleri yönetmek için daha iyi bir fikirdir.

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

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

res/değerler/tarzlarda Bir düğme stili oluşturun:

çözünürlüğünde/çekilebilir klasörü bir XML btn_blue.xml oluşturun: İşte nasıl.

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

xml

Sonra düğmeye bu stil uygulamak:

<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) VEYA btnBlue.setEnabled(false) devlet renkleri otomatik olarak geçiş yapar çağırdığınızda.

5

Sen (çekilebilir/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> 
engelli düğmesi için bir XML dosyası ( çekilebilir/btn_disable.xml)

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

oluşturmak Ve düğme için bir seçici oluşturmalıdır

Seçiciyi düğmeye ekleyin

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

Gri ​​bir görüntü çizebilir ve üzerine çizebilir ve kodunuza ekleyebilirsiniz.

button.setBackgroundResource(R.drawable.grey); 

kolay, basit, ama çünkü biraz daha fazla yer alır resmini kullanarak.