Home | History | Annotate | Download | only in ui
      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 &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 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