1page.title=Kejadian Input
2parent.title=Antarmuka Pengguna
3parent.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.
20Saat mempertimbangkan kejadian dalam antarmuka pengguna Anda, pendekatannya adalah menangkap kejadian
21dari 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
24publik yang tampak berguna untuk kejadian UI. Metode ini dipanggil oleh kerangka kerja Android ketika masing-masing
25tindakan terjadi pada objek itu. Misalnya, bila View (seperti Button/Tombol) disentuh,
26metode <code>onTouchEvent()</code> akan dipanggil pada objek itu. Akan tetapi, untuk mencegatnya, Anda harus memperluas
27kelas dan mengesampingkan metode itu. Akan tetapi, memperluas setiap objek View
28untuk menangani kejadian seperti itu tidaklah praktis. Karena itulah kelas View juga berisi
29sekumpulan antarmuka tersarang dengan callback yang jauh lebih mudah didefinisikan. Antarmuka ini,
30yang 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,
33mungkin ada saatnya Anda ingin memperluas kelas View, untuk membuat komponen custom.
34Mungkin Anda ingin memperluas kelas {@link android.widget.Button}
35untuk membuat sesuatu yang lebih menarik. Dalam hal ini, Anda akan dapat mendefinisikan perilaku kejadian default untuk kelas Anda dengan menggunakan
36kelas <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
42callback tunggal. Metode ini akan dipanggil oleh kerangka kerja Android bila View yang
43telah 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
52menekan 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),
56maupun memfokuskan pada item dengan tombol navigasi atau trackball dan
57menekan 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,
67atau 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
71tentang 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
76dan menangani kejadian Anda, implementasikan antarmuka tersarang dalam Aktivitas Anda atau definisikan sebagai kelas anonim.
77Kemudian, teruskan satu
78instance implementasi Anda pada masing-masing metode <code>View.set...Listener()</code>. (Misalnya, panggil
79<code>{@link android.view.View#setOnClickListener(View.OnClickListener) setOnClickListener()}</code>
80dan 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
86private OnClickListener mCorkyListener = new OnClickListener() {
87    public void onClick(View v) {
88      // do something when the button is clicked
89    }
90};
91
92protected 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.
103Ini akan menghindari beban kelas ekstra dan alokasi objek. Misalnya:</p>
104<pre>
105public 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
121nilai hasil, namun beberapa metode event listener lainnya harus mengembalikan boolean. Sebabnya
122bergantung 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
136kejadian ini bisa memiliki beberapa tindakan yang saling mengikuti. Jadi, jika Anda mengembalikan <em>salah</em>saat
137kejadian tindakan turun diterima, itu menunjukkan bahwa Anda belum menggunakan kejadian itu dan juga
138tidak 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
143hierarki View, kemudian turun hingga tujuan yang sesuai. Jika View Anda (atau anak View Anda)
144saat ini sedang fokus, maka Anda dapat melihat kejadian berpindah melalui metode.<code>{@link android.view.View#dispatchKeyEvent(KeyEvent)
145dispatchKeyEvent()}</code> Sebagai pengganti untuk menangkap kejadian penting melalui View, Anda juga dapat menerima
146semua kejadian dalam Aktivitas Anda dengan <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>
147dan <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
150metode input perangkat lunak. Metode seperti itu tidak harus berbasis tombol; sebagian mungkin menggunakan input suara, tulisan tangan, dan seterusnya. Meskipun
151metode 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
153membangun UI yang mengharuskan penekanan tombol tertentu dikontrol kecuali jika Anda ingin membatasi aplikasi Anda pada perangkat yang memiliki
154keyboard fisik. Khususnya, jangan mengandalkan metode ini untuk memvalidasi input saat pengguna menekan tombol
155enter; melainkan, gunakan tindakan seperti {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} untuk menandai
156metode input mengenai reaksi yang diharapkan aplikasi Anda, sehingga bisa mengubah UI-nya secara signifikan. Hindari anggapan
157tentang 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
160default yang sesuai dari definisi kelas. Karena itu, mengembalikan <em>benar</em> dari event listener ini akan menghentikan
161penyebaran kejadian ke event listener lain dan juga akan memblokir callback ke
162event 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
168metode callback sebagai event handler default.
169Dalam dokumen tentang <a href="{@docRoot}guide/topics/ui/custom-components.html">Komponen
170Custom</a>, Anda akan melihat penggunaan beberapa callback umum untuk penanganan kejadian,
171termasuk:</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,
180namun bisa berdampak langsung pada kemampuan Anda menangani kejadian. Jadi, saat mengelola kejadian yang lebih kompleks dalam
181layout, 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>
197Saat pengguna menyusuri antarmuka pengguna dengan tombol pengarah atau trackball, Anda
198perlu memberikan fokus pada item tindakan (seperti tombol) agar pengguna bisa mengetahui apa
199yang akan menerima input.  Akan tetapi jika perangkat memiliki kemampuan sentuh, dan pengguna
200mulai berinteraksi dengan antarmuka dengan menyentuhnya, maka Anda tidak perlu lagi
201menyorot item, atau memfokuskan pada View tertentu.  Karena itu, ada mode
202untuk interaksi yang bernama "mode sentuh".
203</p>
204<p>
205Untuk perangkat berkemampuan sentuh, setelah pengguna menyentuh layar, perangkat
206akan 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.
208View lain yang dapat disentuh, seperti tombol, tidak akan difokus bila disentuh; View ini akan
209langsung memicu on-click listener bila ditekan.
210</p>
211<p>
212Kapan saja pengguna menekan tombol pengarah atau menggulir dengan trackball, perangkat akan
213keluar dari mode sentuh, dan mencari tampilan untuk difokuskan. Kini pengguna bisa melanjutkan interaksi
214dengan antarmuka pengguna tanpa menyentuh layar.
215</p>
216<p>
217Status mode sentuh dipertahankan di seluruh sistem (semua jendela dan aktivitas).
218Untuk 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.
226Ini termasuk mengubah fokus saat View dihapus atau disembunyikan, atau saat tersedia View
227baru. View menunjukkan kesediaannya untuk mengambil fokus
228melalui metode <code>{@link android.view.View#isFocusable()}</code>. Untuk mengubah apakah View bisa mengambil
229fokus, panggil <code>{@link android.view.View#setFocusable(boolean) setFocusable()}</code>.  Saat dalam mode sentuh,
230Anda dapat me-query apakah View memungkinkan fokus dengan <code>{@link android.view.View#isFocusableInTouchMode()}</code>.
231Anda 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
235arah yang diberikan. Dalam kasus yang jarang terjadi, algoritma default mungkin
236tidak cocok dengan perilaku yang diinginkan pengembang. Dalam situasi ini, Anda bisa memberikan
237pengesampingan 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
240meninggalkan. 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
256mana pun, tidak pula akan menyusuri ke bawah dari Button kedua. Karena sekarang Button atas telah
257mendefinisikan Button bawah sebagai <var>nextFocusUp</var> (dan sebaliknya), fokus navigasi akan
258silih 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),
261tambahkan atribut XML <code>android:focusable</code> ke View, dalam deklarasi layout Anda.
262Atur nilai <var>true</var>. Anda juga bisa mendeklarasikan View
263sebagai 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