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