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 — called widgets and layouts, respectively — 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 — 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 — 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> — 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<view 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class="com.android.notepad.NoteEditor$MyEditText" 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id="@+id/note" 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:layout_width="fill_parent" 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:layout_height="fill_parent" 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:background="@android:drawable/empty" 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:padding="10dip" 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:scrollbars="vertical" 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android:fadingEdge="vertical" /> 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<com.android.notepad.MyEditText 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id="@+id/note" 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 — 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