Android düğmesi nasıl devre dışı bırakılır?


371

Sonraki ve Önceki olmak üzere iki düğme içeren bir düzen oluşturdum. Düğmeler arasında bazı dinamik görünümler oluşturuyorum. Uygulamayı ilk başlattığımda, önceki görünümler olmayacağından "Önceki" düğmesini devre dışı bırakmak istiyorum. Görüntülenecek başka görünüm olmadığında "İleri" düğmesini de devre dışı bırakmak istiyorum. Düğmeleri devre dışı bırakmanın bir yolu var mı?

örnek düzen ekran görüntüsü

Yanıtlar:


801

Bunu denedin mi?

myButton.setEnabled(false); 

Güncelleme: Gwen'e teşekkürler. android:clickableBir düğmenin tıklanabilir olup olmayacağını belirlemek için XML düzeninizde ayarlanabilen neredeyse unutuldu .


66
eşdeğeri android: xml'de etkinleştirildi.
Namratha

1
Ve bunu belgelerde nerede buldunuz? Buradan bağlayabilir misiniz?
Varun

4
@Namratha sadece "Düğme" widget'ları için çalışıyor, bir düğme olarak imageView için değil
mehmet

Xamarin eşdeğeri: myButton.Enabled = false;
Cameron Forvet

48

XML'inizde etkinleştiremez veya devre dışı bırakamazsınız (düzeniniz çalışma zamanında ayarlandığından), ancak etkinliğin başlangıcında tıklanabilir olup olmadığını ayarlayabilirsiniz android:clickable.


4
Android'de 5 yıllık deneyim ve bunu ŞİMDİ öğreniyorum! : /
Sagar

35

Faaliyetinize sadece bir satır kod yazıyorsunuz

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);

Aynı düğmeyi etkinleştirmek istediğinizde şunu yazın:

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);

20
Bu 2 satır. Bu bir. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark

34
Duyguları anlamaya çalışın Matt ..;)
Deepak Sharma

30

Evet, XML'de yalnızca aşağıdakiler kullanılarak devre dışı bırakılabilir:

<Button
android:enabled="false"
/>

2
Bu xml için gerçek cevaptır. Tıklanabilir ile uğraşmanın tüm bu saçmalıklarının, düğmenin devre dışı görünmesini sağlamak için nasıl çizildiği ile ilgisi yoktur.
Scott Biggs

1
Sanırım insanlar bunu yapamayacağınızı düşündüler çünkü AS / IDEA kodunun tamamlanması, yazmaya android:enabledbaşladığınızda önermiyor . (Bu güne kadar bile.)
Kevin Krumwiede

1
setEnabled
Çalışmıyor

23

Java'da, düğmenin referansını aldıktan sonra:

Button button = (Button) findviewById(R.id.button);

Düğmeyi etkinleştirmek / devre dışı bırakmak için aşağıdakilerden birini kullanabilirsiniz:

button.setEnabled(false);
button.setEnabled(true);

Veya:

button.setClickable(false);
button.setClickable(true);

Düğmeyi baştan devre dışı bırakmak istediğiniz için, button.setEnabled (false); onCreate yönteminde. Aksi takdirde, XML'den doğrudan şunları kullanabilirsiniz:

android:clickable = "false"

Yani:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />


1
@Poldie: Aslında, iki yanıtı okursanız, onların oldukça benzer olduğunu ancak eşit olmadığını anlayacaksınız.
Paolo Rovelli

9

Benim durumumda,

myButton.setEnabled(false);
myButton.setEnabled(true);

iyi çalışıyor ve düğmeyi gerektiği gibi etkinleştiriyor ve devre dışı bırakıyor. Ancak düğme durumu devre dışı bırakıldığında, tıklanabilir olmasına rağmen bir daha etkin duruma geri dönmez. Çekilebilir durumu geçersiz kılmayı ve yenilemeyi denedim, ama şans yok.

myButton.invalidate();
myButton.refreshDrawableState();

Siz veya benzer bir sorun yaşayan biri varsa, benim için işe yarayan arka plan tekrar çizilebilir ayarlamaktır. Herhangi bir API Düzeyinde çalışır.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));

8

Kotlin'de, Düğme Görünümüne kimliğe başvurursanız, düğmeyi aşağıdaki gibi etkinleştirin / devre dışı bırakın

Layout.xml

<Button
   android:id="@+id/btn_start"
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="@string/start"
   android:layout_alignParentBottom="true"/>

activity.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button

2

xml'de ilk olarak düğmeyi android:clickable="false"

<Button
        android:id="@+id/btn_send"
        android:clickable="false"/>

sonra kodunuzda, oncreate()method içinde button özelliğini

btn.setClickable(true);

sonra düğmenin içinde kodu

btn.setClickable(false);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setClickable(true);
    btnSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            btnSend.setClickable(false);

        }
    });
}

2

PARAMETRENİN DEĞİŞKEN KURULUMUNU KULLANMAK İÇİN DİNLEYİCİ YANLIŞ !!!

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

DOĞRU YOL:

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        /** check given view  by assertion or cast as u wish */
        if(v instance of Button) {

            /** cast */
            Button button = (Button) v;

            /** we can perform some check up */
            if(button.getId() == EXPECTED_ID) {

                /** disable view */
                button.setEnabled(false)            
                button.setClickable(false); 
            }

        } else {

             /** you can for example find desired view by root view  */
             Button bt = (Button) v.getRootView().findViewById(R.id.btId);

             /*check for button */
             if(bt!=null) {

                 /** disable button view */
                 ...
             } else {
                 /** according to @jeroen-bollen remark
                   * we made assumption that we expected a view
                   * of type button here in other any case  
                   */
                  throw new IllegalArgumentException("Wrong argument: " +
                         "View passed to method is not a Button type!");
             }
          }
       }
    });

EDIT: @ jeroen-bollen adlı kişiye yanıt olarak

 View.OnClickListener 

olduğu Arayüz tanımı bir görünüm tıklandığında bir geri arama çağrılacak için.

ile yöntem tanımı

void onClick(View v);

görünüm tıklandığında, View sınıfı nesnesi, parametrenin kendisi olarak gönderme yöntem onClick () yöntemine geri çağrı yapar, bu nedenle bir Onaylama Hatası ise null view parametresi oluşmamalıdır , örneğin View object sınıfının bu arada yok edilmesi durumunda ( GC tarafından toplanan örnek) veya yöntem hack nedeniyle kurcalanmıştır

instanceof & null hakkında biraz

JLS / 15.20.2. Tür Karşılaştırma Operatörü örneği

Çalışma zamanında, RelationalExpression değeri null değilse ve başvuru bir ClassCastException oluşturmadan ReferenceType'a dönüştürülebilirse instanceof operatörünün sonucu true olur.

Aksi takdirde sonuç yanlıştır .


Yazardan üç kelime

U NEDEN SORUNSA?

EN ÇOK KAPSAMAZ NullPointerException

Biraz daha fazla kod, kodunuzdaki daha sonraki hata takibine zaman kazandıracak ve anormallik oluşumunu azaltacaktır.

aşağıdaki örneği düşünün:

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

2
Başka bir ifadenin çağrıldığı herhangi bir zaman gibi görünüyor, kod zaten hatalandı. Bir Düğme bekliyordunuz ama başka bir şey geçti. A olmadığında bir istisna atmalısınız . vButton
Jeroen

Ne demek istediğimi değil, yine de bir gelişme.
Jeroen

@JeroenBollen eelaborate lütfen :) tamam ben tutarlı değil sadece bir şey görüyorum "yöntemine yanlış görünüm geçti" hakkında istisna mesajı.Ayrıca sadece nasıl görünmesi gerektiğini göstermek için bir girişimdir.
ceph3us

Demek istediğim, fonksiyonun kendisi null aldığında, zaten bir hata ve bir istisna atmalı.
Jeroen

1

Kotlin ile şunları yapabilirsiniz,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
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.