Home | History | Annotate | Download | only in ui
      1 page.title=Kejadian Input
      2 parent.title=Antarmuka Pengguna
      3 parent.link=index.html
      4 @jd:body
      5 
      6 <div id="qv-wrapper">
      7 <div id="qv">
      8   <h2>Dalam dokumen ini</h2>
      9   <ol>
     10     <li><a href="#EventListeners">Event Listener</a></li>
     11     <li><a href="#EventHandlers">Event Handler</a></li>
     12     <li><a href="#TouchMode">Mode Sentuh</a></li>
     13     <li><a href="#HandlingFocus">Menangani Fokus</a></li>
     14   </ol>
     15 
     16 </div>
     17 </div>
     18 
     19 <p>Di Android, ada lebih dari satu cara untuk mencegat kejadian dari interaksi pengguna dengan aplikasi Anda.
     20 Saat mempertimbangkan kejadian dalam antarmuka pengguna Anda, pendekatannya adalah menangkap kejadian
     21 dari objek View tertentu yang digunakan pengguna untuk berinteraksi. Kelas View menyediakan sarana untuk melakukannya.</p>
     22 
     23 <p>Dalam berbagai kelas View yang akan digunakan untuk menyusun layout, Anda mungkin melihat beberapa metode callback
     24 publik yang tampak berguna untuk kejadian UI. Metode ini dipanggil oleh kerangka kerja Android ketika masing-masing
     25 tindakan terjadi pada objek itu. Misalnya, bila View (seperti Button/Tombol) disentuh,
     26 metode <code>onTouchEvent()</code> akan dipanggil pada objek itu. Akan tetapi, untuk mencegatnya, Anda harus memperluas
     27 kelas dan mengesampingkan metode itu. Akan tetapi, memperluas setiap objek View
     28 untuk menangani kejadian seperti itu tidaklah praktis. Karena itulah kelas View juga berisi
     29 sekumpulan antarmuka tersarang dengan callback yang jauh lebih mudah didefinisikan. Antarmuka ini, 
     30 yang disebut <a href="#EventListeners">event listener</a>, merupakan tiket Anda untuk menangkap interaksi pengguna dengan UI.</p>
     31 
     32 <p>Walaupun Anda akan lebih sering menggunakan event listener ini untuk interaksi pengguna,
     33 mungkin ada saatnya Anda ingin memperluas kelas View, untuk membuat komponen custom. 
     34 Mungkin Anda ingin memperluas kelas {@link android.widget.Button}
     35 untuk membuat sesuatu yang lebih menarik. Dalam hal ini, Anda akan dapat mendefinisikan perilaku kejadian default untuk kelas Anda dengan menggunakan
     36 kelas <a href="#EventHandlers">event handler</a>.</p>
     37 
     38 
     39 <h2 id="EventListeners">Event Listener</h2>
     40 
     41 <p>Event listener merupakan antarmuka di kelas {@link android.view.View} yang berisi metode
     42 callback tunggal. Metode ini akan dipanggil oleh kerangka kerja Android bila View yang
     43 telah didaftarkan dengan listener dipicu oleh interaksi pengguna dengan item dalam UI.</p>
     44 
     45 <p>Yang juga disertakan dalam antarmuka event listener adalah metode callback berikut ini:</p>
     46 
     47 <dl>
     48   <dt><code>onClick()</code></dt>
     49     <dd>Dari {@link android.view.View.OnClickListener}. 
     50     Ini dipanggil baik saat pengguna menyentuh item
     51  (bila dalam mode sentuh), maupun memfokuskan pada item dengan tombol navigasi atau trackball dan
     52 menekan tombol "enter" yang sesuai atau menekan trackball.</dd>
     53   <dt><code>onLongClick()</code></dt>
     54     <dd>Dari {@link android.view.View.OnLongClickListener}. 
     55     Ini dipanggil baik saat pengguna menyentuh dan menahan item (bila dalam mode sentuh), 
     56 maupun memfokuskan pada item dengan tombol navigasi atau trackball dan
     57 menekan serta menahan tombol "enter" yang sesuai atau menekan dan menahan trackball (selama satu detik).</dd>
     58   <dt><code>onFocusChange()</code></dt>
     59     <dd>Dari {@link android.view.View.OnFocusChangeListener}. 
     60     Ini dipanggil saat pengguna menyusuri ke atau dari item, dengan menggunakan tombol navigasi atau trackball.</dd>
     61   <dt><code>onKey()</code></dt>
     62     <dd>Dari {@link android.view.View.OnKeyListener}. 
     63     Ini dipanggil saat pengguna memfokuskan pada item dan menekan atau melepas tombol fisik pada perangkat.</dd>
     64   <dt><code>onTouch()</code></dt>
     65     <dd>Dari {@link android.view.View.OnTouchListener}. 
     66     Ini dipanggil saat pengguna melakukan tindakan yang digolongkan sebagai kejadian sentuh, termasuk penekanan, pelepasan,
     67 atau gerak perpindahan pada layar (dalam batasan item itu).</dd>
     68   <dt><code>onCreateContextMenu()</code></dt>
     69     <dd>Dari {@link android.view.View.OnCreateContextMenuListener}. 
     70     Ini dipanggil saat Menu Konteks sedang dibuat (akibat "klik lama" terus-menerus). Lihat diskusi 
     71 tentang menu konteks di panduan pengembang <a href="{@docRoot}guide/topics/ui/menus.html#context-menu">Menu</a>.
     72 </dd>
     73 </dl>
     74 
     75 <p>Metode ini satu-satunya yang menempati antarmukanya masing-masing. Untuk mendefinisikan salah satu metode ini
     76 dan menangani kejadian Anda, implementasikan antarmuka tersarang dalam Aktivitas Anda atau definisikan sebagai kelas anonim.
     77 Kemudian, teruskan satu
     78 instance implementasi Anda pada masing-masing metode <code>View.set...Listener()</code>. (Misalnya, panggil 
     79 <code>{@link android.view.View#setOnClickListener(View.OnClickListener) setOnClickListener()}</code> 
     80 dan teruskan implementasi {@link android.view.View.OnClickListener OnClickListener} Anda.)</p>
     81 
     82 <p>Contoh di bawah menunjukkan cara mendaftarkan on-click listener untuk Button. </p>
     83 
     84 <pre>
     85 // Create an anonymous implementation of OnClickListener
     86 private OnClickListener mCorkyListener = new OnClickListener() {
     87     public void onClick(View v) {
     88       // do something when the button is clicked
     89     }
     90 };
     91 
     92 protected void onCreate(Bundle savedValues) {
     93     ...
     94     // Capture our button from layout
     95     Button button = (Button)findViewById(R.id.corky);
     96     // Register the onClick listener with the implementation above
     97     button.setOnClickListener(mCorkyListener);
     98     ...
     99 }
    100 </pre>
    101 
    102 <p>Anda juga akan merasa lebih praktis mengimplementasikan OnClickListener sebagai bagian dari Aktivitas.
    103 Ini akan menghindari beban kelas ekstra dan alokasi objek. Misalnya:</p>
    104 <pre>
    105 public class ExampleActivity extends Activity implements OnClickListener {
    106     protected void onCreate(Bundle savedValues) {
    107         ...
    108         Button button = (Button)findViewById(R.id.corky);
    109         button.setOnClickListener(this);
    110     }
    111 
    112     // Implement the OnClickListener callback
    113     public void onClick(View v) {
    114       // do something when the button is clicked
    115     }
    116     ...
    117 }
    118 </pre>
    119 
    120 <p>Perhatikan bahwa callback <code>onClick()</code> dalam contoh di atas tidak memiliki
    121 nilai hasil, namun beberapa metode event listener lainnya harus mengembalikan boolean. Sebabnya
    122 bergantung pada kejadian. Untuk sebagian yang mengembalikan boolean, ini sebabnya:</p>
    123 <ul>
    124   <li><code>{@link android.view.View.OnLongClickListener#onLongClick(View) onLongClick()}</code> - 
    125     Ini mengembalikan boolean untuk menunjukkan apakah Anda telah menggunakan kejadian dan tidak boleh dibawa lebih jauh. 
    126     Yaitu, mengembalikan <em>benar</em> untuk menunjukkan apakah Anda telah menangani kejadian dan semestinya berhenti di sini; 
    127     mengembalikan <em>salah</em> jika Anda tidak menanganinya dan/atau kejadian semestinya berlanjut ke
    128     on-click listener lainnya.</li>
    129   <li><code>{@link android.view.View.OnKeyListener#onKey(View,int,KeyEvent) onKey()}</code> - 
    130     Ini mengembalikan boolean untuk menunjukkan apakah Anda telah menggunakan kejadian dan tidak boleh dibawa lebih jauh.
    131     Yaitu, mengembalikan <em>benar</em> untuk menunjukkan apakah Anda telah menangani kejadian dan semestinya berhenti di sini; 
    132     mengembalikan <em>salah</em> jika Anda tidak menanganinya dan/atau kejadian semestinya berlanjut ke
    133     on-key listener lainnya.</li>
    134   <li><code>{@link android.view.View.OnTouchListener#onTouch(View,MotionEvent) onTouch()}</code> - 
    135     Ini mengembalikan boolean untuk menunjukkan apakah listener Anda telah menggunakan kejadian ini. Yang penting adalah 
    136 kejadian ini bisa memiliki beberapa tindakan yang saling mengikuti. Jadi, jika Anda mengembalikan <em>salah</em>saat 
    137 kejadian tindakan turun diterima, itu menunjukkan bahwa Anda belum menggunakan kejadian itu dan juga 
    138 tidak tertarik dengan tindakan berikutnya dari kejadian ini. Karena itu, Anda tidak akan diminta untuk melakukan tindakan
    139  lainnya dalam kejadian, seperti gerakan jari, atau kejadian tindakan naik yang akan terjadi.</li>
    140 </ul>
    141 
    142 <p>Ingatlah bahwa kejadian tombol fisik selalu disampaikan ke View yang sedang difokus. Kejadian ini dikirim mulai dari atas
    143 hierarki View, kemudian turun hingga tujuan yang sesuai. Jika View Anda (atau anak View Anda)
    144 saat ini sedang fokus, maka Anda dapat melihat kejadian berpindah melalui metode.<code>{@link android.view.View#dispatchKeyEvent(KeyEvent)
    145 dispatchKeyEvent()}</code> Sebagai pengganti untuk menangkap kejadian penting melalui View, Anda juga dapat menerima 
    146 semua kejadian dalam Aktivitas Anda dengan <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>
    147 dan <code>{@link android.app.Activity#onKeyUp(int,KeyEvent) onKeyUp()}</code>.</p>
    148 
    149 <p>Selain itu, saat memikirkan tentang input teks aplikasi Anda, ingatlah bahwa banyak perangkat yang hanya memiliki
    150 metode input perangkat lunak. Metode seperti itu tidak harus berbasis tombol; sebagian mungkin menggunakan input suara, tulisan tangan, dan seterusnya. Meskipun 
    151 metode input menyajikan antarmuka seperti keyboard, itu umumnya <strong>tidak</strong> memicu keluarga kejadian
    152 <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>. Anda sama sekali tidak boleh
    153 membangun UI yang mengharuskan penekanan tombol tertentu dikontrol kecuali jika Anda ingin membatasi aplikasi Anda pada perangkat yang memiliki
    154 keyboard fisik. Khususnya, jangan mengandalkan metode ini untuk memvalidasi input saat pengguna menekan tombol
    155 enter; melainkan, gunakan tindakan seperti {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} untuk menandai
    156 metode input mengenai reaksi yang diharapkan aplikasi Anda, sehingga bisa mengubah UI-nya secara signifikan. Hindari anggapan
    157 tentang bagaimana metode input perangkat lunak seharusnya bekerja dan percayalah bahwa metode akan menyediakan teks yang sudah diformat bagi aplikasi Anda.</p>
    158 
    159 <p class="note"><strong>Catatan:</strong> Android akan memanggil event handler terlebih dahulu kemudian handler
    160 default yang sesuai dari definisi kelas. Karena itu, mengembalikan <em>benar</em> dari event listener ini akan menghentikan 
    161 penyebaran kejadian ke event listener lain dan juga akan memblokir callback ke 
    162 event handler default di View. Pastikan bahwa Anda ingin mengakhiri kejadian saat mengembalikan <em>true</em>.</p>
    163 
    164 
    165 <h2 id="EventHandlers">Event Handler</h2>
    166 
    167 <p>Jika Anda membuat komponen custom dari View, maka Anda dapat mendefinisikan penggunaan beberapa 
    168 metode callback sebagai event handler default.
    169 Dalam dokumen tentang <a href="{@docRoot}guide/topics/ui/custom-components.html">Komponen
    170 Custom</a>, Anda akan melihat penggunaan beberapa callback umum untuk penanganan kejadian,
    171 termasuk:</p>
    172 <ul>
    173   <li><code>{@link  android.view.View#onKeyDown}</code> - Dipanggil bila terjadi kejadian tombol baru.</li>
    174   <li><code>{@link  android.view.View#onKeyUp}</code> - Dipanggil bila terjadi kejadian tombol naik.</li>
    175   <li><code>{@link  android.view.View#onTrackballEvent}</code> - Dipanggil bila terjadi kejadian gerakan trackball.</li>
    176   <li><code>{@link  android.view.View#onTouchEvent}</code> - Dipanggil bila terjadi kejadian gerakan layar sentuh.</li>
    177   <li><code>{@link  android.view.View#onFocusChanged}</code> - Dipanggil bila View memperoleh atau kehilangan fokus.</li>
    178 </ul>
    179 <p>Ada beberapa metode lain yang harus Anda ketahui, yang bukan bagian dari kelas View, 
    180 namun bisa berdampak langsung pada kemampuan Anda menangani kejadian. Jadi, saat mengelola kejadian yang lebih kompleks dalam
    181 layout, pertimbangkanlah metode-metode lain ini:</p>
    182 <ul>
    183   <li><code>{@link  android.app.Activity#dispatchTouchEvent(MotionEvent)
    184     Activity.dispatchTouchEvent(MotionEvent)}</code> - Ini memungkinkan {@link 
    185     android.app.Activity} Anda mencegat semua kejadian sentuh sebelum dikirim ke jendela.</li>
    186   <li><code>{@link  android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)
    187     ViewGroup.onInterceptTouchEvent(MotionEvent)}</code> - Ini memungkinkan {@link
    188     android.view.ViewGroup} memantau kejadian saat dikirim ke View anak.</li>
    189   <li><code>{@link  android.view.ViewParent#requestDisallowInterceptTouchEvent(boolean)
    190     ViewParent.requestDisallowInterceptTouchEvent(boolean)}</code> - Panggil ini
    191     pada View induk untuk menunjukan larangan mencegat kejadian sentuh dengan <code>{@link 
    192     android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)}</code>.</li>
    193 </ul>
    194 
    195 <h2 id="TouchMode">Mode Sentuh</h2>
    196 <p>
    197 Saat pengguna menyusuri antarmuka pengguna dengan tombol pengarah atau trackball, Anda
    198 perlu memberikan fokus pada item tindakan (seperti tombol) agar pengguna bisa mengetahui apa
    199 yang akan menerima input.  Akan tetapi jika perangkat memiliki kemampuan sentuh, dan pengguna
    200 mulai berinteraksi dengan antarmuka dengan menyentuhnya, maka Anda tidak perlu lagi
    201 menyorot item, atau memfokuskan pada View tertentu.  Karena itu, ada mode
    202 untuk interaksi yang bernama "mode sentuh". 
    203 </p>
    204 <p>
    205 Untuk perangkat berkemampuan sentuh, setelah pengguna menyentuh layar, perangkat
    206 akan masuk ke mode sentuh.  Dari sini dan selanjutnya, hanya View dengan 
    207 {@link android.view.View#isFocusableInTouchMode} benar yang akan dapat difokus, seperti widget pengedit teks.
    208 View lain yang dapat disentuh, seperti tombol, tidak akan difokus bila disentuh; View ini akan
    209 langsung memicu on-click listener bila ditekan.
    210 </p>
    211 <p>
    212 Kapan saja pengguna menekan tombol pengarah atau menggulir dengan trackball, perangkat akan
    213 keluar dari mode sentuh, dan mencari tampilan untuk difokuskan. Kini pengguna bisa melanjutkan interaksi
    214 dengan antarmuka pengguna tanpa menyentuh layar.
    215 </p>
    216 <p>
    217 Status mode sentuh dipertahankan di seluruh sistem (semua jendela dan aktivitas). 
    218 Untuk query status saat ini, Anda bisa memanggil
    219 {@link android.view.View#isInTouchMode} untuk mengetahui apakah perangkat saat ini sedang dalam mode sentuh.
    220 </p>
    221 
    222 
    223 <h2 id="HandlingFocus">Menangani Fokus</h2>
    224 
    225 <p>Kerangka kerja ini akan menangani gerakan fokus rutin sebagai respons input pengguna.
    226 Ini termasuk mengubah fokus saat View dihapus atau disembunyikan, atau saat tersedia View
    227 baru. View menunjukkan kesediaannya untuk mengambil fokus
    228 melalui metode <code>{@link android.view.View#isFocusable()}</code>. Untuk mengubah apakah View bisa mengambil
    229 fokus, panggil <code>{@link android.view.View#setFocusable(boolean) setFocusable()}</code>.  Saat dalam mode sentuh,
    230 Anda dapat me-query apakah View memungkinkan fokus dengan <code>{@link android.view.View#isFocusableInTouchMode()}</code>.
    231 Anda bisa mengubahnya dengan <code>{@link android.view.View#setFocusableInTouchMode(boolean) setFocusableInTouchMode()}</code>.
    232 </p>
    233 
    234 <p>Gerakan fokus berdasarkan pada algoritma yang mencari tetangga terdekat dalam
    235 arah yang diberikan. Dalam kasus yang jarang terjadi, algoritma default mungkin
    236 tidak cocok dengan perilaku yang diinginkan pengembang. Dalam situasi ini, Anda bisa memberikan
    237 pengesampingan eksplisit dengan mengikuti atribut XML berikut dalam file layout:
    238 <var>nextFocusDown</var>, <var>nextFocusLeft</var>, <var>nextFocusRight</var>, dan
    239 <var>nextFocusUp</var>. Tambahkan salah satu atribut ini ke View <em>dari</em> mana fokus
    240 meninggalkan. Definisikan nilai atribut untuk menjadi ID View
    241 <em>ke</em> mana fokus harus diberikan. Misalnya:</p>
    242 <pre>
    243 &lt;LinearLayout
    244     android:orientation="vertical"
    245     ... >
    246   &lt;Button android:id="@+id/top"
    247           android:nextFocusUp="@+id/bottom"
    248           ... />
    249   &lt;Button android:id="@+id/bottom"
    250           android:nextFocusDown="@+id/top"
    251           ... />
    252 &lt;/LinearLayout>
    253 </pre>
    254 
    255 <p>Biasanya, dalam layout vertikal ini, navigasi ke atas dari Button pertama tidak akan membawa ke
    256 mana pun, tidak pula akan menyusuri ke bawah dari Button kedua. Karena sekarang Button atas telah
    257 mendefinisikan Button bawah sebagai <var>nextFocusUp</var> (dan sebaliknya), fokus navigasi akan
    258 silih berganti dari atas ke bawah dan bawah ke atas.</p>
    259 
    260 <p>Jika Anda ingin mendeklarasikan View sebagai dapat difokus dalam UI (bila biasanya tidak dapat difokus), 
    261 tambahkan atribut XML <code>android:focusable</code> ke View, dalam deklarasi layout Anda.
    262 Atur nilai <var>true</var>. Anda juga bisa mendeklarasikan View
    263 sebagai dapat difokus saat dalam Mode Sentuh dengan <code>android:focusableInTouchMode</code>.</p>
    264 <p>Untuk meminta View tertentu difokus, panggil <code>{@link android.view.View#requestFocus()}</code>.</p>
    265 <p>Untuk mendengarkan kejadian fokus (diberi tahu bila View menerima atau kehilangan fokus), gunakan
    266 <code>{@link android.view.View.OnFocusChangeListener#onFocusChange(View,boolean) onFocusChange()}</code>
    267 , seperti yang dibahas di bagian <a href="#EventListeners">Event Listener</a>, di atas.</p>
    268 
    269 
    270 
    271 <!--
    272 <h2 is="EventCycle">Event Cycle</h2>
    273    <p>The basic cycle of a View is as follows:</p>
    274    <ol>
    275     <li>An event comes in and is dispatched to the appropriate View. The View
    276     handles the event and notifies any listeners.</li>
    277     <li>If, in the course of processing the event, the View's bounds may need
    278     to be changed, the View will call {@link android.view.View#requestLayout()}.</li>
    279     <li>Similarly, if in the course of processing the event the View's appearance
    280     may need to be changed, the View will call {@link android.view.View#invalidate()}.</li>
    281     <li>If either {@link android.view.View#requestLayout()} or {@link android.view.View#invalidate()} were called,
    282     the framework will take care of measuring, laying out, and drawing the tree
    283     as appropriate.</li>
    284    </ol>
    285    
    286    <p class="note"><strong>Note:</strong> The entire View tree is single threaded. You must always be on
    287    the UI thread when calling any method on any View.
    288    If you are doing work on other threads and want to update the state of a View
    289    from that thread, you should use a {@link android.os.Handler}.
    290    </p>
    291 -->
    292