1b10b48f62d3cac684424e4181d4e8ec61f227e95Scott Mainpage.title=Custom Components
233baa5ad7d8cdcc89ce4fbc3bc8cd537d5f5d639Joe Fernandezpage.tags=view,widget
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@jd:body
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<div id="qv-wrapper">
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<div id="qv">
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <h2>In this document</h2>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <ol>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <li><a href="#basic">The Basic Approach</a></li>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <li><a href="#custom">Fully Customized Components</a></li>
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <li><a href="#compound">Compound Controls</a></li>
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <li><a href="#modifying">Modifying an Existing View Type</a></li>
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </ol>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</div>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</div>
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Android offers a sophisticated and powerful componentized model for building your UI, 
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbased on the fundamental layout classes: {@link android.view.View} and 
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.view.ViewGroup}. To start with, the platform includes a variety of prebuilt 
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectView and ViewGroup subclasses &mdash; called widgets and layouts, respectively &mdash; 
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat you can use to construct your UI.</p>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>A partial list of available widgets includes {@link android.widget.Button Button}, 
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.TextView TextView}, 
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.EditText EditText}, 
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.ListView ListView},
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.CheckBox CheckBox}, 
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.RadioButton RadioButton}, 
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.Gallery Gallery}, 
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.Spinner Spinner}, and the more special-purpose 
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.AutoCompleteTextView AutoCompleteTextView}, 
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.ImageSwitcher ImageSwitcher}, and
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.TextSwitcher TextSwitcher}. </p>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Among the layouts available are {@link android.widget.LinearLayout LinearLayout}, 
36eb086d60b2b3425dec37d41b059d9e9cadfbbd18Scott Main{@link android.widget.FrameLayout FrameLayout}, {@link android.widget.RelativeLayout RelativeLayout}, 
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectand others. For more examples, see <a href="layout-objects.html">Common Layout Objects</a>.</p>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>If none of the prebuilt widgets or layouts meets your needs, you can create your own View subclass. 
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIf you only need to make small adjustments to an existing widget or layout, you can simply subclass 
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthe widget or layout and override its methods.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Creating your own View subclasses gives you precise control over the appearance and function 
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectof a screen element. To give an idea of the control you get with custom views, here are some 
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectexamples of what you could do with them:</p>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ul>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You could create a completely custom-rendered View type, for example a "volume
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    control" knob rendered using 2D graphics, and which resembles an
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    analog electronic control.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You could combine a group of View components into a new single component, perhaps
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    to make something like a ComboBox (a combination of popup list and free
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    entry text field), a dual-pane selector control (a left and right pane
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    with a list in each where you can re-assign which item is in which
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    list), and so on.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You could override the way that an EditText component is rendered on the screen
6322558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty    (the <a href="{@docRoot}resources/samples/NotePad/index.html">Notepad Tutorial</a> uses this to good effect, 
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    to create a lined-notepad page).
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You could capture other events like key presses and handle them in some custom
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    way (such as for a game).
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ul>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectThe sections below explain how to create custom Views and use them in your application. 
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFor detailed reference information, see the {@link android.view.View} class. </p>
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2 id="basic">The Basic Approach</h2>
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Here is a high level overview of what you need to know to get started in creating your own
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectView components:</p>
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Extend an existing {@link android.view.View View} class or subclass 
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	with your own class.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Override some of the methods from the superclass. The superclass methods 
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    to override start with '<code>on</code>', for
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    example, {@link android.view.View#onDraw onDraw()}, 
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {@link android.view.View#onMeasure onMeasure()}, and 
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {@link android.view.View#onKeyDown onKeyDown()}.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    This is similar to the <code>on...</code> events in {@link android.app.Activity Activity} 
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    or {@link android.app.ListActivity ListActivity}
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    that you override for lifecycle and other functionality hooks.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Use your new extension class. Once completed, your new extension class 
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    can be used in place of the view upon which it was based.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>  
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p class="note"><strong>Tip:</strong>
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Extension classes can be defined as inner classes inside the activities
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    that use them. This is useful because it controls access to them but
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    isn't necessary (perhaps you want to create a new public View for
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    wider use in your application).
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2 id="custom">Fully Customized Components</h2>
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFully customized components can be used to create graphical components that
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectappear however you wish. Perhaps a graphical VU
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmeter that looks like an old analog gauge, or a sing-a-long text view where
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecta bouncing ball moves along the words so you can sing along with a karaoke
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmachine. Either way, you want something that the built-in components just
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectwon't do, no matter how you combine them.</p>
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Fortunately, you can easily create components that look and behave in any
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectway you like, limited perhaps only by your imagination, the size of the
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectscreen, and the available processing power (remember that ultimately your
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectapplication might have to run on something with significantly less power
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthan your desktop workstation).</p>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>To create a fully customized component:</p> 
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    The most generic view you can extend is, unsurprisingly, {@link
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android.view.View View}, so you will usually start by extending this to
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    create your new super component.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You can supply a constructor which can
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    take attributes and parameters from the XML, and you can also consume
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    your own such attributes and parameters (perhaps the color and range of
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the VU meter, or the width and damping of the needle, etc.)
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You will probably want to create your own event listeners,
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    property accessors and modifiers, and possibly more sophisticated
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    behavior in your component class as well.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You will almost certainly want to override <code>onMeasure()</code> and
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    are also likely to need to override <code>onDraw()</code> if you want
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the component to show something. While both have default behavior,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the default <code>onDraw()</code> will do nothing, and the default
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>onMeasure()</code> will always set a size of 100x100 &mdash; which is
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    probably not what you want.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Other <code>on...</code> methods may also be overridden as required.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h3>Extend <code>onDraw()</code> and <code>onMeasure()</code></h3>
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The <code>onDraw()</code> method delivers you a {@link android.graphics.Canvas Canvas}
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectupon which you can implement anything you want: 2D graphics, other standard or
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcustom components, styled text, or anything else you can think of.</p>
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p class="note"><strong>Note:</strong>
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectThis does not apply to 3D graphics. If you want to
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuse 3D graphics, you must extend {@link android.view.SurfaceView SurfaceView}
1617f877069274c94b373478a8d0c969c9cfd93864fElliott Hughesinstead of View, and draw from a separate thread. See the
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGLSurfaceViewActivity sample
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfor details.</p>
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p><code>onMeasure()</code> is a little more involved. <code>onMeasure()</code>
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectis a critical piece of the rendering contract between your component and its
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcontainer. <code>onMeasure()</code> should be overridden to efficiently and
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectaccurately report the measurements of its contained parts. This is made
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectslightly more complex by the requirements of limits from the parent
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project(which are passed in to the <code>onMeasure()</code> method) and by the
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrequirement to call the <code>setMeasuredDimension()</code> method with the
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmeasured width and height once they have been calculated. If you fail to
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcall this method from an overridden <code>onMeasure()</code> method, the 
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectresult will be an exception at measurement time.</p>
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>At a high level, implementing <code>onMeasure()</code> looks something 
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project like this:</p>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    The overridden <code>onMeasure()</code> method is called with width and
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    height measure specifications (<code>widthMeasureSpec</code> and
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>heightMeasureSpec</code> parameters, both are integer codes
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    representing dimensions) which should be treated as requirements for
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the restrictions on the width and height measurements you should produce. A
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    full reference to the kind of restrictions these specifications can require
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    can be found in the reference documentation under {@link
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android.view.View#onMeasure View.onMeasure(int, int)} (this reference
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    documentation does a pretty good job of explaining the whole measurement
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    operation as well).
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Your component's <code>onMeasure()</code> method should calculate a
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    measurement width and height which will be required to render the
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    component. It should try to stay within the specifications passed in,
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    although it can choose to exceed them (in this case, the parent can
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    choose what to do, including clipping, scrolling, throwing an exception, 
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    or asking the <code>onMeasure()</code> to try again, perhaps with
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    different measurement specifications).
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Once the width and height are calculated, the <code>setMeasuredDimension(int
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    width, int height)</code> method must be called with the calculated
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    measurements. Failure to do this will result in an exception being
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    thrown.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectHere's a summary of some of the other standard methods that the framework calls on views:
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<table border="2" width="85%" align="center" cellpadding="5">
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <thead>
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <tr><th>Category</th> <th>Methods</th> <th>Description</th></tr>
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </thead>
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tbody>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td rowspan="2">Creation</td>
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Constructors</td>
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>There is a form of the constructor that are called when the view
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           is created from code and a form that is called when the view is
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           inflated from a layout file. The second form should parse and apply
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           any attributes defined in the layout file.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link android.view.View#onFinishInflate()}</code></td>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called after a view and all of its children has been inflated
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           from XML.</td>
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td rowspan="3">Layout</td>
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onMeasure}</code></td>
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called to determine the size requirements for this view and all
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           of its children.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onLayout}</code></td>
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when this view should assign a size and position to all
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           of its children.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onSizeChanged}</code></td>
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the size of this view has changed.
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Drawing</td>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onDraw}</code></td>
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the view should render its content.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td rowspan="4">Event processing</td>
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onKeyDown}</code></td>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when a new key event occurs.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onKeyUp}</code></td>
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when a key up event occurs.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>   
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onTrackballEvent}</code></td>
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when a trackball motion event occurs.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>  
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onTouchEvent}</code></td>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when a touch screen motion event occurs.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>  
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td rowspan="2">Focus</td>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onFocusChanged}</code></td>
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the view gains or loses focus.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onWindowFocusChanged}</code></td>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the window containing the view gains or loses focus.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td rowspan="3">Attaching</td>
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onAttachedToWindow()}</code></td>
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the view is attached to a window.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onDetachedFromWindow}</code></td>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the view is detached from its window.
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>     
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       <tr>
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td><code>{@link  android.view.View#onWindowVisibilityChanged}</code></td>
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           <td>Called when the visibility of the window containing the view
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           has changed.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           </td>
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tr>     
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       </tbody>
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   </table>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h3 id="customexample">A Custom View Example</h3>
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The CustomView sample in the 
32022558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty<a href="{@docRoot}resources/samples/ApiDemos/index.html">API Demos</a> provides an example
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectof a customized View. The custom View is defined in the
32222558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html">LabelView</a>
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass.</p>
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The LabelView sample demonstrates a number of different aspects of custom components:</p>
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ul>
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>Extending the View class for a completely custom component.</li>
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>Parameterized constructor that takes the view inflation parameters
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  (parameters defined in the XML). Some of these are passed through to the
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  View superclass, but more importantly, there are some custom attributes defined
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  and used for LabelView.</li>
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>Standard public methods of the type you would expect to see for a label
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  component, for example <code>setText()</code>, <code>setTextSize()</code>,
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <code>setTextColor()</code> and so on.</li>
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>An overridden <code>onMeasure</code> method to determine and set the
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  rendering size of the component. (Note that in LabelView, the real work is done
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  by a private <code>measureWidth()</code> method.)</li>
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>An overridden <code>onDraw()</code> method to draw the label onto the
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  provided canvas.</li>
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ul>
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>You can see some sample usages of the LabelView custom View in
34122558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty<a href="{@docRoot}resources/samples/ApiDemos/res/layout/custom_view_1.html">custom_view_1.xml</a>
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfrom the samples. In particular, you can see a mix of both <code>android:</code>
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace parameters and custom <code>app:</code> namespace parameters. These
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<code>app:</code> parameters are the custom ones that the LabelView recognizes
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectand works with, and are defined in a styleable inner class inside of the
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsamples R resources definition class.</p>
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2 id="compound">Compound Controls
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</h2>
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>If you don't want to create a completely customized component, but instead
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectare looking to put together a reusable component that consists of a group of
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectexisting controls, then creating a Compound Component (or Compound Control) might
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfit the bill. In a nutshell, this brings together a number of more atomic
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcontrols (or views) into a logical group of items that can be treated as a
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsingle thing. For example, a Combo Box can be thought of as a
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcombination of a single line EditText field and an adjacent button with an attached
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PopupList. If you press the button and select
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsomething from the list, it populates the EditText field, but the user can
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectalso type something directly into the EditText if they prefer.</p>
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>In Android, there are actually two other Views readily available to do
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthis: {@link android.widget.Spinner Spinner} and 
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.widget.AutoCompleteTextView AutoCompleteTextView}, but 
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectregardless, the concept of a Combo Box makes an easy-to-understand 
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectexample.</p>
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>To create a compound component:</p>
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    The usual starting point is a Layout of some kind, so create a class
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    that extends a Layout. Perhaps in the case of a Combo box we might use
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    a LinearLayout with horizontal orientation. Remember that other layouts
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    can be nested inside, so the compound component can be arbitrarily
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    complex and structured. Note that just like with an Activity, you can
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    use either the declarative (XML-based) approach to creating the
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    contained components, or you can nest them programmatically from your
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    code.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    In the constructor for the new class, take whatever parameters the
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    superclass expects, and pass them through to the superclass constructor
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    first. Then you can set up the other views to use within your new
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    component; this is where you would create the EditText field and the
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PopupList. Note that you also might introduce your own attributes and
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    parameters into the XML that can be pulled out and used by your
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    constructor.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You can also create listeners for events that your contained views might
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    generate, for example, a listener method for the List Item Click Listener
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    to update the contents of the EditText if a list selection is made.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You might also create your own properties with accessors and modifiers,
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for example, allow the EditText value to be set initially in the
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    component and query for its contents when needed.
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    In the case of extending a Layout, you don't need to override the
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>onDraw()</code> and <code>onMeasure()</code> methods since the
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    layout will have default behavior that will likely work just fine. However, 
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    you can still override them if you need to.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You might override other <code>on...</code> methods, like
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>onKeyDown()</code>, to perhaps choose certain default values from
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the popup list of a combo box when a certain key is pressed.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project To summarize, the use of a Layout as the basis for a Custom Control has a
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnumber of advantages, including:</p>
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ul>
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    You can specify the layout using the declarative XML files just like
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    with an activity screen, or you can create views programmatically and
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nest them into the layout from your code.
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    The <code>onDraw()</code> and <code>onMeasure()</code> methods (plus
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    most of the other <code>on...</code> methods) will likely have suitable behavior so
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    you don't have to override them.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    In the end, you can very quickly construct arbitrarily complex compound
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    views and re-use them as if they were a single component.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ul>
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h4>Examples of Compound Controls</h4>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>In the API Demos project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project that comes with the SDK, there are two List
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project examples &mdash; Example 4 and Example 6 under Views/Lists demonstrate a
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SpeechView which extends LinearLayout to make a component for displaying
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Speech quotes. The corresponding classes in the sample code are
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project <code>List4.java</code> and <code>List6.java</code>.</p>
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2 id="modifying">Modifying an Existing View Type</h2>
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>There is an even easier option for creating a custom View which is
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuseful in certain circumstances. If there is a component that is already very
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsimilar to what you want, you can simply extend that component and just
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectoverride the behavior that you want to change. You can do all of the things
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectyou would do with a fully customized component, but by starting with a more
4457f877069274c94b373478a8d0c969c9cfd93864fElliott Hughesspecialized class in the View hierarchy, you can also get a lot of behavior for
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfree that probably does exactly what you want.</p>
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>For example, the SDK includes a <a
44822558d0be8210aee1a2ab64b374bb357d4123acdDirk Doughertyhref="{@docRoot}resources/samples/NotePad/index.html">NotePad application</a> in the
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsamples. This demonstrates many aspects of using the Android platform, among
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthem is extending an EditText View to make a lined notepad. This is not a
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectperfect example, and the APIs for doing this might change from this early
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpreview, but it does demonstrate the principles.</p>
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>If you haven't done so already, import the 
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectNotePad sample into Eclipse (or
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjust look at the source using the link provided). In particular look at the definition of
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<code>MyEditText</code> in the <a
45722558d0be8210aee1a2ab64b374bb357d4123acdDirk Doughertyhref="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">NoteEditor.java</a>
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfile.</p>
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Some points to note here</p>
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <strong>The Definition</strong>
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <p>The class is defined with the following line:<br/>
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     <code>public static class MyEditText extends EditText</code></p>
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <ul>
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <li>
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        It is defined as an inner class within the <code>NoteEditor</code>
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity, but it is public so that it could be accessed as
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        <code>NoteEditor.MyEditText</code> from outside of the <code>NoteEditor</code>
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class if desired.
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      </li>
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <li>
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        It is <code>static</code>, meaning it does not generate the so-called
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "synthetic methods" that allow it to access data from the parent
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class, which in turn means that it really behaves as a separate
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class rather than something strongly related to <code>NoteEditor</code>.
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        This is a cleaner way to create inner classes if they do not need
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        access to state from the outer class, keeps the generated class
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        small, and allows it to be used easily from other classes.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      </li>
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <li>
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        It extends <code>EditText</code>, which is the View we have chosen to
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        customize in this case. When we are finished, the new class will be
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        able to substitute for a normal <code>EditText</code> view.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      </li>
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    </ul>
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <strong>Class Initialization</strong>
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <p>As always, the super is called first. Furthermore, 
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this is not a default constructor, but a parameterized one. The
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EditText is created with these parameters when it is inflated from an
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML layout file, thus, our constructor needs to both take them and pass them
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    to the superclass constructor as well.</p>
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <strong>Overridden Methods</strong>
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <p>In this example, there is only one method to be overridden: 
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>onDraw()</code> &mdash; but there could easily be others needed when you
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    create your own custom components.</p>
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <p>For the NotePad sample, overriding the <code>onDraw()</code> method allows
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    us to paint the blue lines on the <code>EditText</code> view canvas (the
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas is passed into the overridden <code>onDraw()</code> method). The
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    super.onDraw() method is called before the method ends. The
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    superclass method should be invoked, but in this case, we do it at the
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    end after we have painted the lines we want to include.</p>
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <strong>Use the Custom Component</strong>
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <p>We now have our custom component, but how can we use it? In the
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NotePad example, the custom component is used directly from the
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    declarative layout, so take a look at <code>note_editor.xml</code> in the
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <code>res/layout</code> folder.</p>
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre>
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project&lt;view
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  class=&quot;com.android.notepad.NoteEditor$MyEditText&quot; 
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  id=&quot;&#64;+id/note&quot;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:layout_width=&quot;fill_parent&quot;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:layout_height=&quot;fill_parent&quot;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:background=&quot;&#64;android:drawable/empty&quot;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:padding=&quot;10dip&quot;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:scrollbars=&quot;vertical&quot;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  android:fadingEdge=&quot;vertical&quot; /&gt;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</pre>
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    <ul>
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <li>
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        The custom component is created as a generic view in the XML, and
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        the class is specified using the full package. Note also that the
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inner class we defined is referenced using the
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        <code>NoteEditor$MyEditText</code> notation which is a standard way to
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refer to inner classes in the Java programming language.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        <p>If your custom View component is not defined as an inner class, then you can,
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alternatively, declare the View component 
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        with the XML element name, and exclude the <code>class</code> attribute. For example:</p>
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre>
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project&lt;com.android.notepad.MyEditText
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  id=&quot;&#64;+id/note&quot;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  ... />
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</pre>
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <p>Notice that the <code>MyEditText</code> class is now a separate class file. When the class
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      is nested in the <code>NoteEditor</code> class, this technique will not work.</p>
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      </li>
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      <li>
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        The other attributes and parameters in the definition are the ones
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        passed into the custom component constructor, and then passed
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        through to the EditText constructor, so they are the same
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parameters that you would use for an EditText view. Note that it is
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        possible to add your own parameters as well, and we will touch on
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this again below.
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      </li>
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    </ul>
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </li>
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>And that's all there is to it. Admittedly this is a simple case, but
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat's the point &mdash; creating custom components is only as complicated as you
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectneed it to be.</p>
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>A more sophisticated component may override even more <code>on...</code> methods and
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectintroduce some of its own helper methods, substantially customizing its properties and
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbehavior. The only limit is your imagination and what you need the component to
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdo.</p>
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
563