Jak wyłączyć przycisk Androida?

369

Utworzyłem układ, który zawiera dwa przyciski, Następny i Poprzedni. Pomiędzy przyciskami generuję dynamiczne widoki. Więc kiedy uruchamiam aplikację po raz pierwszy, chcę wyłączyć przycisk „Poprzedni”, ponieważ nie będzie żadnych wcześniejszych widoków. Chcę również wyłączyć przycisk „Dalej”, gdy nie ma więcej widoków do wyświetlenia. Czy istnieje możliwość wyłączenia przycisków?

zrzut ekranu z przykładowym układem

Dijo David
źródło

Odpowiedzi:

799

Próbowałeś tego?

myButton.setEnabled(false); 

Aktualizacja: Dzięki Gwen. Prawie zapomniałem, że android:clickablemożna ustawić w układzie XML, aby ustalić, czy przycisk można kliknąć, czy nie.

Varun
źródło
66
odpowiednikiem jest android: włączony w xml.
Namratha
1
A gdzie to znalazłeś w dokumentacji? Czy możesz to tutaj link?
Varun
4
@Namratha działa tylko dla widżetów „Button”, nie dla imageView jako przycisk
mehmet
Odpowiednik Xamarin: myButton.Enabled = false;
Cameron Forward
48

Nie możesz go włączyć ani wyłączyć w swoim pliku XML (ponieważ układ jest ustawiony w czasie wykonywania), ale możesz ustawić, czy można go kliknąć przy uruchomieniu działania za pomocą android:clickable.

Gwen
źródło
4
5 lat doświadczenia w Androidzie i dowiaduję się o tym TERAZ! : /
Sagar,
35

Po prostu piszesz jeden wiersz kodu w swojej działalności

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

Jeśli chcesz włączyć ten sam przycisk, po prostu napisz

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
źródło
20
To są 2 linie. To jest jeden. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark,
34
Spróbuj zrozumieć uczucia Matt ..;)
Deepak Sharma
30

Tak, można go wyłączyć w XML za pomocą:

<Button
android:enabled="false"
/>
Mulaffer
źródło
2
To jest prawdziwa odpowiedź na XML. Cały ten bzdurny bałagan z klikalnym nie ma nic wspólnego z tym, jak przycisk jest rysowany, żeby wyglądał na wyłączony.
Scott Biggs,
1
Myślę, że ludzie myśleli, że nie możesz tego zrobić, ponieważ uzupełnianie kodu AS / IDEA nie sugeruje, android:enabledkiedy zaczniesz go pisać. (Nawet do dziś.)
Kevin Krumwiede
1
Próbowałem to nie działa, tylko z kodu setEnabledpracuje
FindOutIslamNow
23

W Javie, gdy masz już odniesienie do przycisku:

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

Aby włączyć / wyłączyć przycisk, możesz użyć:

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

Lub:

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

Ponieważ chcesz wyłączyć przycisk od samego początku, możesz użyć button.setEnabled (false); w metodzie onCreate. W przeciwnym razie z XML możesz bezpośrednio użyć:

android:clickable = "false"

Więc:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />
Paolo Rovelli
źródło
odpowiedział 8 grudnia 2010 o 7:08 Varun
1
@Poldie: Właściwie, jeśli przeczytasz te dwie odpowiedzi, zrozumiesz, że są dość podobne, ale nie równe.
Paolo Rovelli,
9

W moim przypadku,

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

działa dobrze i włącza i wyłącza przycisk tak, jak powinien. Ale gdy stan przycisku zostanie wyłączony, nigdy nie wraca do stanu włączonego, chociaż można go kliknąć. Próbowałem unieważnić i odświeżyć stan do rysowania, ale bez powodzenia.

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

Jeśli ty lub ktokolwiek ma podobny problem, to co dla mnie działa, to ponowne ustawienie tła do rysowania. Działa na dowolnym poziomie interfejsu API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
Ayorhan
źródło
8

W Kotlin, jeśli odwołujesz się do widoku przycisku z identyfikatorem, włącz / wyłącz przycisk tak jak

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
Sackurise
źródło
2

najpierw w xml ustaw przycisk jako android:clickable="false"

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

następnie w kodzie oncreate()metoda inside ustaw właściwość button jako

btn.setClickable(true);

następnie wewnątrz przycisku kliknij zmień kod na

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

        }
    });
}
rajeesh
źródło
2

NIEPRAWIDŁOWY SPOSÓB W SŁUCHAWCE DO STOSOWANIA ZMIENNEGO ZAMIAST PARAMETRU !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

WŁAŚCIWY SPOSÓB:

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!");
             }
          }
       }
    });

EDYCJA: W odpowiedzi na @ jeroen-bollen

 View.OnClickListener 

jest definicją interfejsu dla wywołania zwrotnego, które ma być wywoływane po kliknięciu widoku.

z definicją metody

void onClick(View v);

po kliknięciu widoku obiekt klasy View wywołuje wywołanie metody onClick () wysyłającej jako sam parametr, więc parametr widoku zerowego nie powinien wystąpić, jeśli jest to błąd asercji , może się to zdarzyć na przykład, gdy klasa obiektu widoku została w międzyczasie zniszczona (dla przykład zebrany przez GC) lub metoda została zmieniona z powodu włamania

trochę o instanceof i null

JLS / 15.20.2. Porównanie typów Operator instanceof

W czasie wykonywania wynik operatora instanceof ma wartość true, jeśli wartość RelationalExpression nie jest równa null, a odwołanie można rzutować na ReferenceType bez wywoływania wyjątku ClassCastException.

W przeciwnym razie wynik jest fałszywy .


trzy słowa autora

JEŚLI PYTAJ DLACZEGO?

NAJBARDZIEJ UNIKAJ NullPointerException

Niewiele więcej kodu pozwoli zaoszczędzić Twój czas na późniejszym śledzeniu błędów w twoim kodzie i zmniejszy liczbę nieprawidłowości.

rozważ następujący przykład:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
źródło
2
Wygląda na to, że za każdym razem, gdy wywołane zostanie wyrażenie else, kod jest już uszkodzony. Oczekiwałeś przycisku, ale coś innego zostało przekazane. Państwo powinno wyjątek, gdy vnie jest Button.
Jeroen,
Nie do końca to, co miałem na myśli, ale mimo to poprawa.
Jeroen,
@ JeroenBollen eelaborate proszę :) ok widzę tylko jedną rzecz niespójną to komunikat o wyjątku dotyczący „niewłaściwego widoku przekazanego do metody”. Poza tym to tylko próba pokazania, jak to powinno wyglądać.
ceph3us
Miałem na myśli to, że gdy sama funkcja otrzymuje wartość null, jest to już błąd i powinna zgłosić wyjątek.
Jeroen,
1

Z Kotlin możesz to zrobić,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Wszystko to
źródło