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