Bagaimana cara menonaktifkan tombol Android?

371

Saya telah membuat tata letak yang berisi dua tombol, Berikutnya dan Sebelumnya. Di antara tombol saya menghasilkan beberapa pandangan dinamis. Jadi ketika saya pertama kali meluncurkan aplikasi saya ingin menonaktifkan tombol "Sebelumnya" karena tidak akan ada tampilan sebelumnya. Saya juga ingin menonaktifkan tombol "Next" ketika tidak ada lebih banyak tampilan untuk ditampilkan. Apakah ada cara untuk menonaktifkan tombol?

tangkapan layar tata letak sampel

Dijo David
sumber

Jawaban:

802

Apakah kamu mencoba ini?

myButton.setEnabled(false); 

Pembaruan: Terima kasih kepada Gwen. Hampir lupa bahwa android:clickabledapat diatur dalam tata letak XML Anda untuk menentukan apakah suatu tombol dapat diklik atau tidak.

Varun
sumber
66
yang setara adalah android: diaktifkan di xml.
Namratha
1
Dan di mana Anda menemukannya dalam dokumentasi? Bisakah Anda menautkannya di sini?
Varun
4
@Namratha berfungsi hanya untuk widget "Button", bukan untuk imageView sebagai tombol
mehmet
Setara Xamarin: myButton.Enabled = false;
Penyerang Cameron
48

Anda tidak dapat mengaktifkan atau menonaktifkannya di XML Anda (karena tata letak Anda diatur pada saat runtime), tetapi Anda dapat mengatur apakah itu dapat diklik pada saat peluncuran aktivitas dengan android:clickable.

Gwen
sumber
4
5 tahun pengalaman di Android dan saya mengetahui hal ini SEKARANG! : /
Sagar
35

Anda cukup menulis satu baris kode dalam aktivitas Anda

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

Ketika Anda ingin mengaktifkan tombol yang sama tulis saja

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
sumber
20
Itu adalah 2 baris. Ini satu. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark
34
Cobalah untuk memahami perasaan Matt ..;)
Deepak Sharma
30

Ya itu bisa dinonaktifkan dalam XML hanya menggunakan:

<Button
android:enabled="false"
/>
Mulaffer
sumber
2
Ini adalah jawaban nyata untuk xml. Semua omong kosong mengacaukan yang bisa diklik tidak ada hubungannya dengan bagaimana tombol digambar untuk membuatnya terlihat dinonaktifkan.
Scott Biggs
1
Saya pikir orang berpikir Anda tidak bisa melakukan ini karena penyelesaian kode AS / IDEA tidak menyarankan android:enabledketika Anda mulai mengetiknya. (Bahkan hingga hari ini.)
Kevin Krumwiede
1
Saya mencoba tidak bekerja, hanya dari kode setEnabledyang berfungsi
FindOutIslamNow
23

Di Jawa, setelah Anda memiliki referensi tombol:

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

Untuk mengaktifkan / menonaktifkan tombol, Anda dapat menggunakan:

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

Atau:

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

Karena Anda ingin menonaktifkan tombol dari awal, Anda dapat menggunakan button.setEnabled (false); dalam metode onCreate. Jika tidak, dari XML, Anda dapat langsung menggunakan:

android:clickable = "false"

Begitu:

<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
sumber
menjawab 8 Des 10 pada 7:08 Varun
1
@ Poldie: Sebenarnya, jika Anda membaca dua jawaban Anda akan mengerti bahwa keduanya sangat mirip tetapi tidak sama.
Paolo Rovelli
9

Dalam hal ini,

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

berfungsi dengan baik dan itu mengaktifkan dan menonaktifkan tombol sebagaimana mestinya. Tetapi begitu status tombol dinonaktifkan, tidak pernah kembali ke status diaktifkan lagi, meskipun itu dapat diklik. Saya mencoba membatalkan dan menyegarkan keadaan yang dapat digambar, tetapi tidak berhasil.

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

Jika Anda atau siapa pun yang memiliki masalah serupa, yang berhasil bagi saya adalah mengatur latar belakang dapat digambar kembali. Bekerja pada Level API apa pun.

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

Di Kotlin, jika Anda merujuk Tampilan Tombol dengan id, aktifkan / nonaktifkan tombol seperti

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

pertama di xml buat tombol sebagai android:clickable="false"

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

kemudian dalam kode Anda, oncreate()metode di dalam mengatur properti tombol sebagai

btn.setClickable(true);

kemudian di dalam tombol klik ubah kode menjadi

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

CARA SALAH DALAM MENDENGARKAN GUNAKAN BUKAN PARAMETER BERBAGAI VARIABEL !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

CARA YANG BENAR:

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: Sebagai balasan untuk @ jeroen-bollen

 View.OnClickListener 

adalah definisi Antarmuka untuk panggilan balik yang akan dipanggil ketika tampilan diklik.

dengan definisi metode

void onClick(View v);

ketika tampilan diklik objek Lihat kelas membuat panggilan balik ke metode onClick () mengirim sebagai parameter itu sendiri, jadi parameter tampilan nol tidak boleh terjadi jika itu merupakan Kesalahan Pernyataan itu bisa terjadi misalnya ketika kelas objek Lihat dihancurkan sementara (untuk contoh dikumpulkan oleh GC) atau metode dirusak karena peretasan

sedikit tentang instanceof & null

JLS / 15.20.2. Ketik Contoh Operator Perbandingan

Pada saat dijalankan, hasil dari instanceof bernilai benar jika nilai RelationalExpression tidak nol dan referensi dapat dilemparkan ke ReferenceType tanpa menaikkan ClassCastException.

Kalau tidak, hasilnya salah .


tiga kata dari Penulis

JIKA ANDA MEMINTA MENGAPA?

PALING UNTUK MENGHINDARI NullPointerException

Sedikit lebih banyak kode akan menghemat waktu Anda pada pelacakan bug selanjutnya dalam kode Anda & mengurangi terjadinya kelainan.

pertimbangkan contoh berikut:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
sumber
2
Sepertinya kapan saja ekspresi lain dipanggil, kode sudah disadap. Anda mengharapkan Tombol tetapi sesuatu yang lain telah berlalu. Anda harus melempar pengecualian ketika vbukan Button.
Jeroen
Bukan apa yang saya maksudkan, tetapi perbaikan tetap saja.
Jeroen
@JeroenBollen eelaborate tolong :) ok saya hanya melihat satu hal yang tidak konsisten itu pesan pengecualian tentang "pandangan salah diteruskan ke metode". Selain itu hanya upaya untuk menunjukkan bagaimana seharusnya terlihat.
ceph3us
Maksud saya, ketika fungsi itu sendiri menerima null, itu sudah bug dan harus membuang pengecualian.
Jeroen
1

Dengan Kotlin yang bisa Anda lakukan,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Semuanya
sumber