1 page.title=Eventos de entrada 2 parent.title=Interface do usurio 3 parent.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 interao de um usurio com o aplicativo. 20 Ao considerar os eventos dentro da interface do usurio, a abordagem capturar os eventos 21 de um objeto de View especfico com o qual o usurio interage. A classe View fornece os meios para fazer isto.</p> 22 23 <p>Dentro das vrias classes View que voc usar para compor o layout, possvel notar vrios mtodos 24 pblicos de retorno de chamada que parecem teis para eventos de IU. Esses mtodos so chamados pela estrutura do Android quando 25 a ao respectiva ocorre neste objeto. Por exemplo, quando uma View (como um boto) tocada, 26 o mtodo <code>onTouchEvent()</code> chamado neste objeto. No entanto, para interceptar isto, voc deve estender 27 a classe e substituir o mtodo. No entanto, estender todos os objetos de View 28 para lidar com tal evento no seria algo prtico. por isso que a classe View tambm contm 29 uma coleo de interfaces aninhadas com retornos de chamada que podem ser definidas com muito mais facilidade. Essas interfaces, 30 chamadas de <a href="#EventListeners">escutas de evento</a>, so a sua passagem para capturar a interao do usurio com a IU.</p> 31 32 <p>Geralmente, as escutas de evento so usadas para escutar a interao do usurio. 33 No entanto, h casos em que voc pode querer estender uma classe View para criar um componente personalizado. 34 Talvez voc queira estender a classe {@link android.widget.Button} 35 para deixar algo mais extravagante. Neste caso, voc poder definir os comportamentos de evento padro 36 para 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 contm 42 um nico mtodo de retorno de chamada. Esses mtodos sero chamados pela estrutura do Android, quando a View para a qual a escuta 43 estiver registrada for ativada pela interao do usurio com o item na IU.</p> 44 45 <p>Inclusos nas interfaces da escuta de evento esto os seguintes mtodos 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 usurio toca no item 51 (no modo de toque), ou atribui foco ao item com as teclas de navegao 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 usurio toca e mantm o item pressionado (no modo de toque), 56 ou atribui foco ao item com as teclas de navegao ou cursor de bola 57 e mantm 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 usurio navega no ou do item, usando as teclas de navegao ou cursor de bola.</dd> 61 <dt><code>onKey()</code></dt> 62 <dd>De {@link android.view.View.OnKeyListener}. 63 Isto chamado quando o usurio 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 usurio realiza uma ao qualificada como um toque de evento, incluindo o pressionamento, a liberao, 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 construdo (como resultado de um "clique longo"). Consulte a discusso 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 mtodos so os nicos habitantes de suas respectivas interfaces. Para definir um desses mtodos 76 e lidar com seus eventos, implemente a interface aninhada na atividade ou defina-a como uma classe annima. 77 Em seguida, passe uma instncia da implementao 78 para o respectivo mtodo <code>View.set...Listener()</code>. (Ex.:, chame 79 <code>{@link android.view.View#setOnClickListener(View.OnClickListener) setOnClickListener()}</code> 80 e passe-o implementao de {@link android.view.View.OnClickListener OnClickListener}.)</p> 81 82 <p>O exemplo abaixo mostra como registrar uma escuta de clique para um boto. </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>Voc tambm pode achar mais conveniente implementar OnClickListener como parte da atividade. 103 Isto evitar carga adicional na classe e a alocao do objeto. Por exemplo:</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>Observe que o retorno de chamada <code>onClick()</code> no exemplo acima 121 no tem valor de retorno, mas outros mtodos de escuta de evento podem retornar um booleano. O motivo 122 depende do evento. Para os poucos que retornam, apresenta-se a razo:</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 no deve seguir adiante; 127 ou retorna <em>falso</em> caso voc no 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 no deve seguir adiante; 132 ou retorna <em>falso</em> caso voc no 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 vrias aes que se seguem mutuamente. Portanto, se retornar <em>falso</em> quando 137 o evento de ao inferior for recebido, voc indicar que no consumiu o evento e que no est 138 interessado em aes subsequentes deste evento. Logo, voc no ser chamado para outras aes 139 dentro do evento, como um gesto de dedo ou um evento de ao para cima eventual.</li> 140 </ul> 141 142 <p>Lembre-se de que os eventos de tecla de hardware sempre so entregues vista atualmente em foco. Eles so enviados a partir da parte superior 143 da hierarquia de vistas e segue parte inferior at atingir o destino adequado. Se a vista (ou um filho da vista) 144 estiver em foco, possvel ver o percurso do evento pelo mtodo <code>{@link android.view.View#dispatchKeyEvent(KeyEvent) 145 dispatchKeyEvent()}</code>. Como uma alternativa para capturar eventos de tecla por meio da vista, tambm possvel 146 receber todos os eventos dentro da Atividade com <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code> 147 e <code>{@link android.app.Activity#onKeyUp(int,KeyEvent) onKeyUp()}</code>.</p> 148 149 <p>Alm disso, ao pensar sobre a entrada de texto para o aplicativo, lembre-se de que vrios dispositivos possuem apenas 150 mtodos de entrada de software. Tais mtodos no precisam ser baseados em teclas; alguns podem usar entrada de texto por voz, por escrita e outros. Mesmo se um mtodo de entrada 151 apresentar uma interface parecida com teclado, geralmente ele <strong>no</strong> ativa 152 a famlia de eventos <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>. Nunca deve-se compilar 153 uma IU que exija pressionamentos de teclas especficas para ser controlada, a no ser que voc queira limitar o aplicativo a dispositivos 154 com um teclado fsico. Em particular, no confie nestes mtodos para validar a entrada quando o usurio pressiona a tecla 155 de retorno; em vez disso, use aes como {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} para sinalizar 156 ao mtodo de entrada como o aplicativo espera reagir para que ele possa alterar a IU de forma significativa. Evite suposies 157 sobre como um mtodo 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>Observao:</strong> o Android chamar manipuladores de evento e, em seguida, manipuladores adequados padro 160 a partir da segunda definio de classe. Logo, retornar <em>verdadeiro</em> destas escutas de evento 161 interromper a propagao do evento para outras escutas de evento e tambm bloquear o retorno de chamada 162 para o manipulador de evento padro 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, ento voc poder definir vrios mtodos de retorno de chamada 168 usados como manipuladores de evento padro. 169 No documento sobre <a href="{@docRoot}guide/topics/ui/custom-components.html">Componentes 170 personalizados</a>, voc aprender a ver alguns dos retornos de chamada usados para lidar com eventos, 171 incluindo:</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 mtodos que voc deve ter cincia que no fazem parte da classe View, 180 mas podem ter impacto direto na maneira de lidar com os eventos. Portanto, ao gerenciar eventos mais complexos 181 dentro de um layout, considere esses outros mtodos:</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 so 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 no 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> 197 Quando um usurio est navegando em uma interface do usurio com teclas direcionais ou cursor de bola, 198 necessrio fornecer foco para itens de ao (como botes) para que o usurio possa 199 ver o que aceitar entrada. Se o dispositivo tiver capacidades de toque, no entanto, e o usurio 200 comear a interagir com a interface por meio de toque, ento no mais necessrio 201 destacar itens ou fornecer foco para uma vista especfica. Contudo, h um modo 202 de interao chamado "modo de toque". 203 </p> 204 <p> 205 Para dispositivos com capacidades de toque, quando o usurio toca na tela, o dispositivo 206 entra no modo de toque. A partir deste ponto, somente vistas que tiverem 207 {@link android.view.View#isFocusableInTouchMode} como verdadeiro podero ter foco, como widgets de edio de texto. 208 Outras vistas tocveis, como botes, no recebero foco ao serem tocadas. Em vez disso, 209 elas simplesmente dispararo escutas de clique quando forem pressionadas. 210 </p> 211 <p> 212 Sempre que um usurio pressionar teclas direcionais ou rolar com o cursor de bola, o dispositivo 213 sair do modo de toque e encontrar uma vista para atribuir foco. Agora, o usurio pode retomar a interao 214 com a interface do usurio sem tocar na tela. 215 </p> 216 <p> 217 O estado de modo de toque mantido em todo o sistema (todas as janelas e atividades). 218 Para consultar o estado atual, possvel 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 usurio. 226 Isto inclui a mudana de foco medida que as vistas so removidas ou ocultadas, ou medida que novas 227 vistas se tornem disponveis. As vistas indicam a prontido para receber foco 228 por meio do mtodo <code>{@link android.view.View#isFocusable()}</code>. Para determinar se uma vista pode receber 229 foco, chame <code>{@link android.view.View#setFocusable(boolean) setFocusable()}</code>. Quando no modo de toque, 230 possvel consultar se uma vista permite foco com <code>{@link android.view.View#isFocusableInTouchMode()}</code>. 231 possvel 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 prximo 235 em uma dada direo. Em casos raros, o algoritmo padro pode no corresponder 236 ao comportamento pretendido do desenvolvedor. Nessas situaes, possvel 237 fornecer substituies explcitas 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> 240 do 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 boto 256 no resultaria em nada, nem navegar para baixo a partir do segundo boto. Agora que o boto superior 257 definiu o boto do fundo como <var>nextFocusUp</var> (e vice-versa), o foco da navegao 258 alternar 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 no ), 261 adicione o atributo XML <code>android:focusable</code> vista, na declarao do layout. 262 Defina o valor <var>como verdadeiro</var>. Tambm possvel declarar uma vista 263 como 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 notificaes quando uma vista receber ou perder foco), use 266 <code>{@link android.view.View.OnFocusChangeListener#onFocusChange(View,boolean) onFocusChange()}</code>, 267 como discutido na seo <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