blob: 96136f8ad4ab706c54494741c1e6f50502707c48 [file] [log] [blame]
page.title=Handling UI Events
parent.title=Views and Layout
parent.link=index.html
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
<ol>
<li><a href="#TouchMode">Touch Mode</a></li>
<li><a href="#Scrolling">Scrolling</a></li>
<li><a href="#EventCycle">Event Cycle</a></li>
</ol>
<h2>See also</h2>
<ol>
<li><a href="{@docRoot}guide/tutorials/views/hello-formstuff.html">Hello Form Stuff tutorial</a></li>
</ol>
</div>
</div>
<p>Many Android classes declare callback methods for handling relevant UI events such as keypresses,
touch events, focus changes, and so on. For example, {@link android.app.Activity Activity} provides
the methods <code>onKeyDown()</code> and <code>onKeyUp()</code> and {@link android.widget.TextView TextView}
provides <code>onFocusChanged()</code>. </p>
<p>In most cases, you can handle events just by overriding the appropriate handler methods.
When an event is received, the Android system calls your handler method with the event data.</p>
<p>However, some classes do not declare handler methods for specific events. For example,
{@link android.widget.Button} does not declare an <code>onClick()</code> handler method. So, to handle a click event,
you need to create an anonymous class to act as a listener for the event, then register the listener with the
target class object (via the appropriate <code>set...Listener()</code> method). The example below shows how to set
up a handler for click events in a Button object. </p>
</p>
<pre>public class ExampleSendResult extends Activity
{
protected void onCreate(Bundle savedValues)
{
...
// Capture our button from layout and listen for clicks.
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(mCorkyListener);
}
// Create an anonymous class to act as a button click listener.
private OnClickListener mCorkyListener = new OnClickListener()
{
public void onClick(View v)
{
//do something when the button is clicked
}
};
}
</pre>
<h2 id="TouchMode">Touch Mode</h2>
<p>
When a user is navigating a user interface via directional keys such as a D-pad, it is
necessary to give focus to actionable items such as buttons so the user can see
what will take input. If the device has touch capabilities, however, and the user
begins interacting with the interface by touching it, it is no longer necessary to
always highlight, or give focus to, a particular view. Thus, there is a mode
for interaction named "touch mode."
</p>
<p>
For a touch-capable device, once the user touches the screen, the device
will enter touch mode. From this point onward, only views for which
{@link android.view.View#isFocusableInTouchMode} is true will be focusable, such as text editing widgets.
Other views that are touchable, like buttons, will not take focus when touched; they will
simply fire their on-click listeners when pressed.
</p>
<p>
Any time a user hits a directional key, such as a D-pad direction, the view device will
exit touch mode, and find a view to take focus, so that the user may resume interacting
with the user interface without touching the screen.
</p>
<p>
The touch mode state is maintained across {@link android.app.Activity}s. To query the current state, you can call
{@link android.view.View#isInTouchMode} to see whether the device is currently in touch mode.
</p>
<h2 id="Scrolling">Scrolling</h2>
<p>
The framework provides basic support for views that wish to internally
scroll their content. This includes keeping track of the X and Y scroll
offset as well as mechanisms for drawing scrollbars. See
{@link android.view.View#scrollBy(int, int)}, {@link android.view.View#scrollTo(int, int)} for more details.
</p>
<h2 is="EventCycle">Event Cycle</h2>
<p>The basic cycle of a view is as follows:</p>
<ol>
<li>An event comes in and is dispatched to the appropriate view. The view
handles the event and notifies any listeners.</li>
<li>If, in the course of processing the event, the view's bounds may need
to be changed, the view will call {@link android.view.View#requestLayout()}.</li>
<li>Similarly, if in the course of processing the event the view's appearance
may need to be changed, the view will call {@link android.view.View#invalidate()}.</li>
<li>If either {@link android.view.View#requestLayout()} or {@link android.view.View#invalidate()} were called,
the framework will take care of measuring, laying out, and drawing the tree
as appropriate.</li>
</ol>
<p class="note"><strong>Note:</strong> The entire view tree is single threaded. You must always be on
the UI thread when calling any method on any view.
If you are doing work on other threads and want to update the state of a view
from that thread, you should use a {@link android.os.Handler}.
</p>