1page.title=Eventos de entrada
2parent.title=Interface do usuário
3parent.link=index.html
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8  <h2>Neste documento</h2>
9  <ol>
10    <li><a href="#EventListeners">Escutas de evento</a></li>
11    <li><a href="#EventHandlers">Manipuladores de evento</a></li>
12    <li><a href="#TouchMode">Modo de toque</a></li>
13    <li><a href="#HandlingFocus">Tratamento de foco</a></li>
14  </ol>
15
16</div>
17</div>
18
19<p>No Android, há mais de uma maneira de interceptar os eventos da interação de um usuário com o aplicativo.
20Ao considerar os eventos dentro da interface do usuário, a abordagem é capturar os eventos
21de um objeto de View específico com o qual o usuário interage. A classe View fornece os meios para fazer isto.</p>
22
23<p>Dentro das várias classes View que você usará para compor o layout, é possível notar vários métodos
24públicos de retorno de chamada que parecem úteis para eventos de IU. Esses métodos são chamados pela estrutura do Android quando
25a ação respectiva ocorre neste objeto. Por exemplo, quando uma View (como um botão) é tocada,
26o método <code>onTouchEvent()</code> é chamado neste objeto. No entanto, para interceptar isto, você deve estender
27a classe e substituir o método. No entanto, estender todos os objetos de View
28para lidar com tal evento não seria algo prático. É por isso que a classe View também contém
29uma coleção de interfaces aninhadas com retornos de chamada que podem ser definidas com muito mais facilidade. Essas interfaces,
30chamadas de <a href="#EventListeners">escutas de evento</a>, são a sua passagem para capturar a interação do usuário com a IU.</p>
31
32<p>Geralmente, as escutas de evento são usadas para escutar a interação do usuário.
33No entanto, há casos em que você pode querer estender uma classe View para criar um componente personalizado.
34Talvez você queira estender a classe {@link android.widget.Button}
35para deixar algo mais extravagante. Neste caso, você poderá definir os comportamentos de evento padrão
36para a classe usando <a href="#EventHandlers">manipuladores de evento</a>.</p>
37
38
39<h2 id="EventListeners">Escutas de evento</h2>
40
41<p>Uma escuta de evento é uma interface na classe {@link android.view.View} que contém
42um único método de retorno de chamada. Esses métodos serão chamados pela estrutura do Android, quando a View para a qual a escuta
43estiver registrada for ativada pela interação do usuário com o item na IU.</p>
44
45<p>Inclusos nas interfaces da escuta de evento estão os seguintes métodos de retorno de chamada:</p>
46
47<dl>
48  <dt><code>onClick()</code></dt>
49    <dd>De {@link android.view.View.OnClickListener}.
50    Isto é chamado quando o usuário toca no item
51    (no modo de toque), ou atribui foco ao item com as teclas de navegação ou cursor de bola
52    e pressiona a tecla "enter" adequada ou pressiona o cursor de bola.</dd>
53  <dt><code>onLongClick()</code></dt>
54    <dd>De {@link android.view.View.OnLongClickListener}.
55    Isto é chamado quando o usuário toca e mantém o item pressionado (no modo de toque),
56 ou atribui foco ao item com as teclas de navegação ou cursor de bola
57    e mantém pressionada a tecla "enter" adequada ou o cursor de bola (por um segundo).</dd>
58  <dt><code>onFocusChange()</code></dt>
59    <dd>De {@link android.view.View.OnFocusChangeListener}.
60    Isto é chamado quando o usuário navega no ou do item, usando as teclas de navegação ou cursor de bola.</dd>
61  <dt><code>onKey()</code></dt>
62    <dd>De {@link android.view.View.OnKeyListener}.
63    Isto é chamado quando o usuário está com foco no item ou solta uma tecla de hardware no dispositivo.</dd>
64  <dt><code>onTouch()</code></dt>
65    <dd>De {@link android.view.View.OnTouchListener}.
66    Isto é chamado quando o usuário realiza uma ação qualificada como um toque de evento, incluindo o pressionamento, a liberação,
67    ou qualquer outro gesto de movimento na tela (dentro dos limites do item).</dd>
68  <dt><code>onCreateContextMenu()</code></dt>
69    <dd>De {@link android.view.View.OnCreateContextMenuListener}.
70    Isto é chamado quando um menu de contexto está sendo construído (como resultado de um "clique longo"). Consulte a discussão
71    sobre menus de contexto no guia do desenvolvedor <a href="{@docRoot}guide/topics/ui/menus.html#context-menu">Menus</a>
72.</dd>
73</dl>
74
75<p>Esses métodos são os únicos habitantes de suas respectivas interfaces. Para definir um desses métodos
76e lidar com seus eventos, implemente a interface aninhada na atividade ou defina-a como uma classe anônima.
77Em seguida, passe uma instância da implementação
78para o respectivo método <code>View.set...Listener()</code>. (Ex.:, chame
79<code>{@link android.view.View#setOnClickListener(View.OnClickListener) setOnClickListener()}</code>
80e passe-o à implementação de {@link android.view.View.OnClickListener OnClickListener}.)</p>
81
82<p>O exemplo abaixo mostra como registrar uma escuta de clique para um botão. </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>Você também pode achar mais conveniente implementar OnClickListener como parte da atividade.
103Isto evitará carga adicional na classe e a alocação do objeto. Por exemplo:</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>Observe que o retorno de chamada <code>onClick()</code> no exemplo acima
121não tem valor de retorno, mas outros métodos de escuta de evento podem retornar um booleano. O motivo
122depende do evento. Para os poucos que retornam, apresenta-se a razão:</p>
123<ul>
124  <li><code>{@link android.view.View.OnLongClickListener#onLongClick(View) onLongClick()}</code> -
125    Isto retorna um booleano para indicar se você consumiu o evento e se ele deve ser levado adiante.
126    Ou seja, ele retorna <em>verdadeiro</em> para indicar que você lidou com o evento e não deve seguir adiante;
127    ou retorna <em>falso</em> caso você não tenha lidado com ele e/ou o evento deva continuar para qualquer
128    outra escuta de clique.</li>
129  <li><code>{@link android.view.View.OnKeyListener#onKey(View,int,KeyEvent) onKey()}</code> -
130    Isto retorna um booleano para indicar se você consumiu o evento e se ele deve ser levado adiante.
131        Ou seja, ele retorna <em>verdadeiro</em> para indicar que você lidou com o evento e não deve seguir adiante;
132    ou retorna <em>falso</em> caso você não tenha lidado com ele e/ou o evento deva continuar para qualquer
133    outra escuta de tecla.</li>
134  <li><code>{@link android.view.View.OnTouchListener#onTouch(View,MotionEvent) onTouch()}</code> -
135    Isto retorna um booleano para indicar se a escuta consome este evento. O importante é que este evento
136    pode possuir várias ações que se seguem mutuamente. Portanto, se retornar <em>falso</em> quando
137    o evento de ação inferior for recebido, você indicará que não consumiu o evento e que não está
138    interessado em ações subsequentes deste evento. Logo, você não será chamado para outras ações
139    dentro do evento, como um gesto de dedo ou um evento de ação para cima eventual.</li>
140</ul>
141
142<p>Lembre-se de que os eventos de tecla de hardware sempre são entregues à vista atualmente em foco. Eles são enviados a partir da parte superior
143da hierarquia de vistas e segue à parte inferior até atingir o destino adequado. Se a vista (ou um filho da vista)
144estiver em foco, é possível ver o percurso do evento pelo método <code>{@link android.view.View#dispatchKeyEvent(KeyEvent)
145dispatchKeyEvent()}</code>. Como uma alternativa para capturar eventos de tecla por meio da vista, também é possível
146receber todos os eventos dentro da Atividade com <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>
147e <code>{@link android.app.Activity#onKeyUp(int,KeyEvent) onKeyUp()}</code>.</p>
148
149<p>Além disso, ao pensar sobre a entrada de texto para o aplicativo, lembre-se de que vários dispositivos possuem apenas
150métodos de entrada de software. Tais métodos não precisam ser baseados em teclas; alguns podem usar entrada de texto por voz, por escrita e outros. Mesmo se um método de entrada
151apresentar uma interface parecida com teclado, geralmente ele <strong>não</strong> ativa
152a família de eventos <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>. Nunca deve-se compilar
153uma IU que exija pressionamentos de teclas específicas para ser controlada, a não ser que você queira limitar o aplicativo a dispositivos
154com um teclado físico. Em particular, não confie nestes métodos para validar a entrada quando o usuário pressiona a tecla
155de retorno; em vez disso, use ações como {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} para sinalizar
156ao método de entrada como o aplicativo espera reagir para que ele possa alterar a IU de forma significativa. Evite suposições
157sobre como um método de entrada de software deve funcionar e confie apenas no fornecimento do texto já formatado para o aplicativo.</p>
158
159<p class="note"><strong>Observação:</strong> o Android chamará manipuladores de evento e, em seguida, manipuladores adequados padrão
160a partir da segunda definição de classe. Logo, retornar <em>verdadeiro</em> destas escutas de evento
161interromperá a propagação do evento para outras escutas de evento e também bloqueará o retorno de chamada
162para o manipulador de evento padrão na vista. Portanto, certifique-se de que quer encerrar o evento ao retornar <em>verdadeiro</em>.</p>
163
164
165<h2 id="EventHandlers">Manipuladores de evento</h2>
166
167<p>Se estiver compilando um componente personalizado a partir de View, então você poderá definir vários métodos de retorno de chamada
168usados como manipuladores de evento padrão.
169No documento sobre <a href="{@docRoot}guide/topics/ui/custom-components.html">Componentes
170personalizados</a>, você aprenderá a ver alguns dos retornos de chamada usados para lidar com eventos,
171incluindo:</p>
172<ul>
173  <li><code>{@link  android.view.View#onKeyDown}</code> - Chamado quando um novo evento de tecla ocorre.</li>
174  <li><code>{@link  android.view.View#onKeyUp}</code> - Chamado quando um evento de tecla para cima ocorre.</li>
175  <li><code>{@link  android.view.View#onTrackballEvent}</code> - Chamado quando um evento de movimento do cursor de bola ocorre.</li>
176  <li><code>{@link  android.view.View#onTouchEvent}</code> - Chamado quando um evento de movimento de toque ocorre.</li>
177  <li><code>{@link  android.view.View#onFocusChanged}</code> - Chamado quando a vista ganha ou perde foco.</li>
178</ul>
179<p>Há alguns outros métodos que você deve ter ciência que não fazem parte da classe View,
180mas podem ter impacto direto na maneira de lidar com os eventos. Portanto, ao gerenciar eventos mais complexos
181dentro de um layout, considere esses outros métodos:</p>
182<ul>
183  <li><code>{@link  android.app.Activity#dispatchTouchEvent(MotionEvent)
184    Activity.dispatchTouchEvent(MotionEvent)}</code> - Isto permite que {@link
185    android.app.Activity} intercepte todos os evento de toque antes de serem enviados à janela.</li>
186  <li><code>{@link  android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)
187    ViewGroup.onInterceptTouchEvent(MotionEvent)}</code> - Isto permite que {@link
188    android.view.ViewGroup} assista aos eventos à medida que são enviados para as vistas filho.</li>
189  <li><code>{@link  android.view.ViewParent#requestDisallowInterceptTouchEvent(boolean)
190    ViewParent.requestDisallowInterceptTouchEvent(boolean)}</code> - Chame isto
191    sobre uma Vista pai para indicar que ela não deve interceptar eventos de toque com <code>{@link
192    android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)}</code>.</li>
193</ul>
194
195<h2 id="TouchMode">Modo de toque</h2>
196<p>
197Quando um usuário está navegando em uma interface do usuário com teclas direcionais ou cursor de bola,
198é necessário fornecer foco para itens de ação (como botões) para que o usuário possa
199ver o que aceitará entrada.  Se o dispositivo tiver capacidades de toque, no entanto, e o usuário
200começar a interagir com a interface por meio de toque, então não é mais necessário
201destacar itens ou fornecer foco para uma vista específica.  Contudo, há um modo
202de interação chamado "modo de toque".
203</p>
204<p>
205Para dispositivos com capacidades de toque, quando o usuário toca na tela, o dispositivo
206entra no modo de toque.  A partir deste ponto, somente vistas que tiverem
207{@link android.view.View#isFocusableInTouchMode} como verdadeiro poderão ter foco, como widgets de edição de texto.
208Outras vistas tocáveis, como botões, não receberão foco ao serem tocadas. Em vez disso,
209elas simplesmente dispararão escutas de clique quando forem pressionadas.
210</p>
211<p>
212Sempre que um usuário pressionar teclas direcionais ou rolar com o cursor de bola, o dispositivo
213sairá do modo de toque e encontrará uma vista para atribuir foco. Agora, o usuário pode retomar a interação
214com a interface do usuário sem tocar na tela.
215</p>
216<p>
217O estado de modo de toque é mantido em todo o sistema (todas as janelas e atividades).
218Para consultar o estado atual, é possível chamar
219{@link android.view.View#isInTouchMode} para ver se o dispositivo está no modo de toque no momento.
220</p>
221
222
223<h2 id="HandlingFocus">Tratamento de foco</h2>
224
225<p>A estrutura lidará com a rotina de movimento de foco em resposta à entrada do usuário.
226Isto inclui a mudança de foco à medida que as vistas são removidas ou ocultadas, ou à medida que novas
227vistas se tornem disponíveis. As vistas indicam a prontidão para receber foco
228por meio do método <code>{@link android.view.View#isFocusable()}</code>. Para determinar se uma vista pode receber
229foco, chame <code>{@link android.view.View#setFocusable(boolean) setFocusable()}</code>.  Quando no modo de toque,
230é possível consultar se uma vista permite foco com <code>{@link android.view.View#isFocusableInTouchMode()}</code>.
231É possível alterar isto com <code>{@link android.view.View#setFocusableInTouchMode(boolean) setFocusableInTouchMode()}</code>.
232</p>
233
234<p>O movimento de foco é baseado em um algoritmo que encontra um semelhante mais próximo
235em uma dada direção. Em casos raros, o algoritmo padrão pode não corresponder
236ao comportamento pretendido do desenvolvedor. Nessas situações, é possível
237fornecer substituições explícitas com os seguintes atributos XML no arquivo do layout:
238<var>nextFocusDown</var>, <var>nextFocusLeft</var>, <var>nextFocusRight</var>e
239<var>nextFocusUp</var>. Adicione um desses atributos à vista <em>a partir</em>
240do foco que ela está abandonando. Defina o valor do atributo para ser o ID da vista
241<em>para</em> o foco que deve ser fornecido. Por exemplo:</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>Geralmente, neste layout vertical, navegar para cima a partir do primeiro botão
256não resultaria em nada, nem navegar para baixo a partir do segundo botão. Agora que o botão superior
257definiu o botão do fundo como <var>nextFocusUp</var> (e vice-versa), o foco da navegação
258alternará de "cima para baixo" e "baixo para cima".</p>
259
260<p>Caso queira declarar uma vista como alvo de foco na IU (quando tradicionalmente não é),
261adicione o atributo XML <code>android:focusable</code> à vista, na declaração do layout.
262Defina o valor <var>como verdadeiro</var>. Também é possível declarar uma vista
263como alvo de foco no Modo de Toque com <code>android:focusableInTouchMode</code>.</p>
264<p>Para solicitar foco a uma determinada Vista, chame <code>{@link android.view.View#requestFocus()}</code>.</p>
265<p>Para ouvir eventos de foco (receber notificações quando uma vista receber ou perder foco), use
266<code>{@link android.view.View.OnFocusChangeListener#onFocusChange(View,boolean) onFocusChange()}</code>,
267como discutido na seção <a href="#EventListeners">Escutas de evento</a> acima.</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