lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Kejadian Masukan

Di Android, ada lebih dari satu cara untuk mencegat kejadian dari interaksi pengguna dengan aplikasi Anda. Saat mempertimbangkan kejadian dalam antarmuka pengguna Anda, pendekatannya adalah menangkap kejadian dari objek View tertentu yang digunakan pengguna untuk berinteraksi. Kelas View menyediakan sarana untuk melakukannya.

Dalam berbagai kelas View yang akan digunakan untuk menyusun layout, Anda mungkin melihat beberapa metode callback publik yang tampak berguna untuk kejadian UI. Metode ini dipanggil oleh kerangka kerja Android ketika masing-masing aksi terjadi pada objek itu. Misalnya, bila View (seperti Button/Tombol) disentuh, metode onTouchEvent() akan dipanggil pada objek itu. Akan tetapi, untuk mencegatnya, Anda harus memperluas kelas dan mengganti metode itu. Akan tetapi, memperluas setiap objek View untuk menangani kejadian seperti itu tidaklah praktis. Karena itulah kelas View juga berisi sekumpulan antarmuka tersarang dengan callback yang jauh lebih mudah didefinisikan. Antarmuka ini, yang disebut event listener, merupakan tiket Anda untuk menangkap interaksi pengguna dengan UI.

Walaupun Anda akan lebih sering menggunakan event listener ini untuk interaksi pengguna, mungkin ada saatnya Anda ingin memperluas kelas View, untuk membangun komponen khusus. Mungkin Anda ingin memperluas kelas Button untuk membangun sesuatu yang lebih menarik. Dalam hal ini, Anda akan dapat mendefinisikan perilaku kejadian default untuk kelas Anda dengan menggunakan kelas event handler.

Event Listener

Event listener merupakan antarmuka di kelas View yang berisi metode callback tunggal. Metode ini akan dipanggil oleh kerangka kerja Android bila View yang telah didaftarkan dengan listener dipicu oleh interaksi pengguna dengan item dalam UI.

Yang juga disertakan dalam antarmuka event listener adalah metode callback berikut ini:

onClick()
Dari View.OnClickListener. Ini dipanggil baik saat pengguna menyentuh item (bila dalam mode sentuh), maupun memfokuskan pada item dengan tombol navigasi atau trackball dan menekan tombol "enter" yang sesuai atau menekan trackball.
onLongClick()
Dari View.OnLongClickListener. Ini dipanggil baik saat pengguna menyentuh dan menahan item (bila dalam mode sentuh), maupun memfokuskan pada item dengan tombol navigasi atau trackball dan menekan serta menahan tombol "enter" yang sesuai atau menekan dan menahan trackball (selama satu detik).
onFocusChange()
Dari View.OnFocusChangeListener. Ini dipanggil saat pengguna menyusuri ke atau dari item, dengan menggunakan tombol navigasi atau trackball.
onKey()
Dari View.OnKeyListener. Ini dipanggil saat pengguna memfokuskan pada item dan menekan atau melepas tombol perangkat keras pada perangkat.
onTouch()
Dari View.OnTouchListener. Ini dipanggil saat pengguna melakukan aksi yang digolongkan sebagai kejadian sentuh, termasuk penekanan, pelepasan, atau isyarat perpindahan pada layar (dalam batasan item itu).
onCreateContextMenu()
Dari View.OnCreateContextMenuListener. Ini dipanggil saat Menu Konteks sedang dibuat (akibat "klik lama" terus-menerus). Lihat diskusi tentang menu konteks di panduan developer Menu.

Metode ini satu-satunya yang menempati antarmukanya masing-masing. Untuk mendefinisikan salah satu metode ini dan menangani kejadian Anda, implementasikan antarmuka tersarang dalam Aktivitas Anda atau definisikan sebagai kelas anonim. Kemudian, teruskan satu instance implementasi Anda pada masing-masing metode View.set...Listener(). (Mis., panggil setOnClickListener() dan teruskan implementasi OnClickListener Anda.)

Contoh di bawah menunjukkan cara mendaftarkan on-click listener untuk Button.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

Anda juga akan merasa lebih praktis mengimplementasikan OnClickListener sebagai bagian dari Aktivitas. Ini akan menghindari beban kelas ekstra dan alokasi objek. Misalnya:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
}

Perhatikan bahwa callback onClick() dalam contoh di atas tidak memiliki nilai hasil, namun beberapa metode event listener lainnya harus mengembalikan boolean. Sebabnya bergantung pada kejadian. Untuk sebagian yang mengembalikan boolean, ini sebabnya:

  • onLongClick() - Ini mengembalikan boolean untuk menunjukkan apakah Anda telah menggunakan kejadian dan tidak boleh dilakukan lebih jauh. Yaitu, mengembalikan true untuk menunjukkan apakah Anda telah menangani kejadian dan harus berhenti di sini; mengembalikan false jika Anda tidak menanganinya dan/atau kejadian harus melanjutkan ke on-click listener lainnya.
  • onKey() - Ini mengembalikan boolean untuk menunjukkan apakah Anda telah menggunakan kejadian dan tidak boleh dilakukan lebih jauh. Yaitu, mengembalikan benar untuk menunjukkan apakah Anda telah menangani kejadian dan harus berhenti di sini; mengembalikan salah jika Anda tidak menanganinya dan/atau kejadian harus melanjutkan ke on-key listener lainnya.
  • onTouch() - Ini mengembalikan boolean untuk menunjukkan apakah listener Anda telah menggunakan kejadian ini. Yang penting adalah kejadian ini bisa memiliki beberapa tindakan yang saling mengikuti. Jadi, jika Anda mengembalikan salahsaat kejadian aksi turun diterima, itu menunjukkan bahwa Anda belum menggunakan kejadian itu dan juga tidak tertarik dengan tindakan berikutnya dari kejadian ini. Karena itu, Anda tidak akan diminta untuk melakukan tindakan lainnya dalam kejadian, seperti isyarat jari, atau kejadian aksi naik yang akan terjadi.

Ingatlah bahwa kejadian tombol fisik selalu disampaikan ke View yang sedang difokus. Kejadian ini dikirim mulai dari atas hierarki View, kemudian turun hingga tujuan yang sesuai. Jika View Anda (atau anak View Anda) saat ini sedang fokus, maka Anda dapat melihat kejadian berpindah melalui metode.dispatchKeyEvent() Sebagai alternatif untuk menangkap kejadian penting melalui View, Anda juga bisa menerima semua kejadian dalam Aktivitas Anda dengan onKeyDown() dan onKeyUp().

Selain itu, saat memikirkan tentang masukan teks aplikasi Anda, ingatlah bahwa banyak perangkat yang hanya memiliki metode masukan perangkat lunak. Metode seperti itu tidak harus berbasis tombol; sebagian mungkin menggunakan masukan suara, tulisan tangan, dan seterusnya. Meskipun metode masukan menyajikan antarmuka seperti keyboard, itu umumnya tidak memicu keluarga kejadian onKeyDown(). Anda sama sekali tidak boleh membangun UI yang mengharuskan penekanan tombol tertentu dikontrol kecuali jika Anda ingin membatasi aplikasi Anda pada perangkat yang memiliki keyboard fisik. Khususnya, jangan mengandalkan metode ini untuk memvalidasi masukan saat pengguna menekan tombol return; melainkan, gunakan tindakan seperti IME_ACTION_DONE untuk menandai metode masukan mengenai reaksi yang diharapkan aplikasi Anda, sehingga bisa mengubah UI-nya secara signifikan. Hindari anggapan tentang bagaimana metode masukan perangkat lunak seharusnya bekerja dan percayalah bahwa metode akan menyediakan teks yang sudah diformat bagi aplikasi Anda.

Catatan: Android akan memanggil penangan kejadian terlebih dahulu kemudian penangan default yang sesuai dari definisi kelas. Karena itu, mengembalikan benar dari event listener ini akan menghentikan penyebaran kejadian ke event listener lain dan juga akan memblokir callback ke penangan kejadian default di View. Pastikan bahwa Anda ingin mengakhiri kejadian saat mengembalikan true.

Penangan Kejadian

Jika Anda membangun komponen khusus dari View, maka Anda dapat mendefinisikan penggunaan beberapa metode callback sebagai penangan kejadian default. Dalam dokumen tentang Komponen Khusus, Anda akan melihat penggunaan beberapa callback umum untuk penanganan kejadian, termasuk:

Ada beberapa metode lain yang harus Anda ketahui, yang bukan bagian dari kelas View, namun bisa berdampak langsung pada cara Anda menangani kejadian. Jadi, saat mengelola kejadian yang lebih kompleks dalam layout, pertimbangkan metode-metode lain ini:

Mode Sentuh

Saat pengguna menyusuri antarmuka pengguna dengan tombol pengarah atau trackball, Anda perlu memberikan fokus pada item aksi (seperti tombol) agar pengguna bisa mengetahui apa yang akan menerima masukan. Akan tetapi jika perangkat memiliki kemampuan sentuh, dan pengguna mulai berinteraksi dengan antarmuka dengan menyentuhnya, maka Anda tidak perlu lagi menyorot item, atau memfokuskan pada View tertentu. Karena itu, ada mode untuk interaksi yang bernama "mode sentuh".

Untuk perangkat berkemampuan sentuh, setelah pengguna menyentuh layar, perangkat akan masuk ke mode sentuh. Dari sini dan selanjutnya, hanya View dengan isFocusableInTouchMode() benar yang akan dapat difokus, seperti widget pengedit teks. View lain yang dapat disentuh, seperti tombol, tidak akan difokus bila disentuh; View ini akan langsung memicu on-click listener bila ditekan.

Kapan saja pengguna menekan tombol pengarah atau menggulir dengan trackball, perangkat akan keluar dari mode sentuh, dan mencari tampilan untuk difokuskan. Kini pengguna bisa melanjutkan interaksi dengan antarmuka pengguna tanpa menyentuh layar.

Status mode sentuh dipertahankan di seluruh sistem (semua jendela dan aktivitas). Untuk kueri status saat ini, Anda bisa memanggil isInTouchMode() untuk mengetahui apakah perangkat saat ini sedang dalam mode sentuh.

Menangani Fokus

Kerangka kerja ini akan menangani gerakan fokus rutin sebagai respons masukan pengguna. Ini termasuk mengubah fokus saat View dihapus atau disembunyikan, atau saat tersedia View baru. View menunjukkan kesediaannya untuk mengambil fokus melalui metode isFocusable(). Untuk mengubah apakah View bisa mengambil fokus, panggil setFocusable(). Saat dalam mode sentuh, Anda dapat melakukan kueri apakah View memungkinkan fokus dengan isFocusableInTouchMode(). Anda bisa mengubahnya dengan setFocusableInTouchMode().

Gerakan fokus berdasarkan pada algoritme yang mencari tetangga terdekat dalam arah yang diberikan. Dalam kasus yang jarang terjadi, algoritme default mungkin tidak cocok dengan perilaku yang diinginkan developer. Dalam situasi ini, Anda bisa menyediakan penggantian eksplisit dengan atribut XML berikut dalam file layout: nextFocusDown, nextFocusLeft, nextFocusRight, dan nextFocusUp. Tambahkan salah satu atribut ini ke View dari mana fokus meninggalkan. Definisikan nilai atribut untuk menjadi ID View ke mana fokus harus diberikan. Misalnya:

<LinearLayout
    android:orientation="vertical"
    ... >
  <Button android:id="@+id/top"
          android:nextFocusUp="@+id/bottom"
          ... />
  <Button android:id="@+id/bottom"
          android:nextFocusDown="@+id/top"
          ... />
</LinearLayout>

Biasanya, dalam layout vertikal ini, navigasi ke atas dari Button pertama tidak akan membawa ke mana pun, tidak pula akan menyusuri ke bawah dari Button kedua. Karena sekarang Button atas telah mendefinisikan Button bawah sebagai nextFocusUp (dan sebaliknya), fokus navigasi akan silih berganti dari atas ke bawah dan bawah ke atas.

Jika Anda ingin mendeklarasikan View sebagai dapat difokus dalam UI (bila biasanya tidak dapat difokus), tambahkan atribut XML android:focusable ke View, dalam deklarasi layout Anda. Setel nilai true. Anda juga bisa mendeklarasikan View sebagai dapat difokus saat dalam Mode Sentuh dengan android:focusableInTouchMode.

Untuk meminta View tertentu difokus, panggil requestFocus().

Untuk mendengarkan kejadian fokus (diberi tahu bila View menerima atau kehilangan fokus), gunakan onFocusChange() , seperti yang dibahas di bagian Event Listener, di atas.