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<LinearLayout 244 android:orientation="vertical" 245 ... > 246 <Button android:id="@+id/top" 247 android:nextFocusUp="@+id/bottom" 248 ... /> 249 <Button android:id="@+id/bottom" 250 android:nextFocusDown="@+id/top" 251 ... /> 252</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