page.title=Custom Components
page.tags="view","widget"
@jd:body

<div id="qv-wrapper">
<div id="qv">
  <h2>In this document</h2>
  <ol>
    <li><a href="#basic">The Basic Approach</a></li>
    <li><a href="#custom">Fully Customized Components</a></li>
    <li><a href="#compound">Compound Controls</a></li>
    <li><a href="#modifying">Modifying an Existing View Type</a></li>
  </ol>
</div>
</div>

<p>Android offers a sophisticated and powerful componentized model for building your UI, 
based on the fundamental layout classes: {@link android.view.View} and 
{@link android.view.ViewGroup}. To start with, the platform includes a variety of prebuilt 
View and ViewGroup subclasses &mdash; called widgets and layouts, respectively &mdash; 
that you can use to construct your UI.</p>

<p>A partial list of available widgets includes {@link android.widget.Button Button}, 
{@link android.widget.TextView TextView}, 
{@link android.widget.EditText EditText}, 
{@link android.widget.ListView ListView},
{@link android.widget.CheckBox CheckBox}, 
{@link android.widget.RadioButton RadioButton}, 
{@link android.widget.Gallery Gallery}, 
{@link android.widget.Spinner Spinner}, and the more special-purpose 
{@link android.widget.AutoCompleteTextView AutoCompleteTextView}, 
{@link android.widget.ImageSwitcher ImageSwitcher}, and
{@link android.widget.TextSwitcher TextSwitcher}. </p>

<p>Among the layouts available are {@link android.widget.LinearLayout LinearLayout}, 
{@link android.widget.FrameLayout FrameLayout}, {@link android.widget.RelativeLayout RelativeLayout}, 
and others. For more examples, see <a href="layout-objects.html">Common Layout Objects</a>.</p>

<p>If none of the prebuilt widgets or layouts meets your needs, you can create your own View subclass. 
If you only need to make small adjustments to an existing widget or layout, you can simply subclass 
the widget or layout and override its methods.
</p>

<p>Creating your own View subclasses gives you precise control over the appearance and function 
of a screen element. To give an idea of the control you get with custom views, here are some 
examples of what you could do with them:</p>
 
<ul>
  <li>
    You could create a completely custom-rendered View type, for example a "volume
    control" knob rendered using 2D graphics, and which resembles an
    analog electronic control.
  </li>
  <li>
    You could combine a group of View components into a new single component, perhaps
    to make something like a ComboBox (a combination of popup list and free
    entry text field), a dual-pane selector control (a left and right pane
    with a list in each where you can re-assign which item is in which
    list), and so on.
  </li>
  <li>
    You could override the way that an EditText component is rendered on the screen
    (the <a href="{@docRoot}resources/samples/NotePad/index.html">Notepad Tutorial</a> uses this to good effect, 
    to create a lined-notepad page).
  </li>
  <li>
    You could capture other events like key presses and handle them in some custom
    way (such as for a game).
  </li>
</ul>
<p>
The sections below explain how to create custom Views and use them in your application. 
For detailed reference information, see the {@link android.view.View} class. </p>


<h2 id="basic">The Basic Approach</h2>

<p>Here is a high level overview of what you need to know to get started in creating your own
View components:</p>
 
<ol>
  <li>
    Extend an existing {@link android.view.View View} class or subclass 
	with your own class.
  </li>
  <li>
    Override some of the methods from the superclass. The superclass methods 
    to override start with '<code>on</code>', for
    example, {@link android.view.View#onDraw onDraw()}, 
    {@link android.view.View#onMeasure onMeasure()}, and 
    {@link android.view.View#onKeyDown onKeyDown()}.
    This is similar to the <code>on...</code> events in {@link android.app.Activity Activity} 
    or {@link android.app.ListActivity ListActivity}
    that you override for lifecycle and other functionality hooks.
  <li>
    Use your new extension class. Once completed, your new extension class 
    can be used in place of the view upon which it was based.
  </li>
</ol>  
<p class="note"><strong>Tip:</strong>
    Extension classes can be defined as inner classes inside the activities
    that use them. This is useful because it controls access to them but
    isn't necessary (perhaps you want to create a new public View for
    wider use in your application).
</p>



<h2 id="custom">Fully Customized Components</h2>
<p>
Fully customized components can be used to create graphical components that
appear however you wish. Perhaps a graphical VU
meter that looks like an old analog gauge, or a sing-a-long text view where
a bouncing ball moves along the words so you can sing along with a karaoke
machine. Either way, you want something that the built-in components just
won't do, no matter how you combine them.</p>
<p>Fortunately, you can easily create components that look and behave in any
way you like, limited perhaps only by your imagination, the size of the
screen, and the available processing power (remember that ultimately your
application might have to run on something with significantly less power
than your desktop workstation).</p>
<p>To create a fully customized component:</p> 
<ol>
  <li>
    The most generic view you can extend is, unsurprisingly, {@link
    android.view.View View}, so you will usually start by extending this to
    create your new super component.
  </li>
  <li>
    You can supply a constructor which can
    take attributes and parameters from the XML, and you can also consume
    your own such attributes and parameters (perhaps the color and range of
    the VU meter, or the width and damping of the needle, etc.)
  </li>
  <li>
    You will probably want to create your own event listeners,
    property accessors and modifiers, and possibly more sophisticated
    behavior in your component class as well.
  </li>
  <li>
    You will almost certainly want to override <code>onMeasure()</code> and
    are also likely to need to override <code>onDraw()</code> if you want
    the component to show something. While both have default behavior,
    the default <code>onDraw()</code> will do nothing, and the default
    <code>onMeasure()</code> will always set a size of 100x100 &mdash; which is
    probably not what you want.
  </li>
  <li>
    Other <code>on...</code> methods may also be overridden as required.
  </li>
</ol>

<h3>Extend <code>onDraw()</code> and <code>onMeasure()</code></h3>
<p>The <code>onDraw()</code> method delivers you a {@link android.graphics.Canvas Canvas}
upon which you can implement anything you want: 2D graphics, other standard or
custom components, styled text, or anything else you can think of.</p>

<p class="note"><strong>Note:</strong>
This does not apply to 3D graphics. If you want to
use 3D graphics, you must extend {@link android.view.SurfaceView SurfaceView}
instead of View, and draw from a separate thread. See the
GLSurfaceViewActivity sample
for details.</p>

<p><code>onMeasure()</code> is a little more involved. <code>onMeasure()</code>
is a critical piece of the rendering contract between your component and its
container. <code>onMeasure()</code> should be overridden to efficiently and
accurately report the measurements of its contained parts. This is made
slightly more complex by the requirements of limits from the parent
(which are passed in to the <code>onMeasure()</code> method) and by the
requirement to call the <code>setMeasuredDimension()</code> method with the
measured width and height once they have been calculated. If you fail to
call this method from an overridden <code>onMeasure()</code> method, the 
result will be an exception at measurement time.</p>
<p>At a high level, implementing <code>onMeasure()</code> looks something 
 like this:</p>
 
<ol>
  <li>
    The overridden <code>onMeasure()</code> method is called with width and
    height measure specifications (<code>widthMeasureSpec</code> and
    <code>heightMeasureSpec</code> parameters, both are integer codes
    representing dimensions) which should be treated as requirements for
    the restrictions on the width and height measurements you should produce. A
    full reference to the kind of restrictions these specifications can require
    can be found in the reference documentation under {@link
    android.view.View#onMeasure View.onMeasure(int, int)} (this reference
    documentation does a pretty good job of explaining the whole measurement
    operation as well).
  </li>
  <li>
    Your component's <code>onMeasure()</code> method should calculate a
    measurement width and height which will be required to render the
    component. It should try to stay within the specifications passed in,
    although it can choose to exceed them (in this case, the parent can
    choose what to do, including clipping, scrolling, throwing an exception, 
    or asking the <code>onMeasure()</code> to try again, perhaps with
    different measurement specifications).
  </li>
  <li>
    Once the width and height are calculated, the <code>setMeasuredDimension(int
    width, int height)</code> method must be called with the calculated
    measurements. Failure to do this will result in an exception being
    thrown.
  </li>
</ol>

<p>
Here's a summary of some of the other standard methods that the framework calls on views:
</p>
<table border="2" width="85%" align="center" cellpadding="5">
       <thead>
           <tr><th>Category</th> <th>Methods</th> <th>Description</th></tr>
       </thead>
       
       <tbody>
       <tr>
           <td rowspan="2">Creation</td>
           <td>Constructors</td>
           <td>There is a form of the constructor that are called when the view
           is created from code and a form that is called when the view is
           inflated from a layout file. The second form should parse and apply
           any attributes defined in the layout file.
           </td>
       </tr>
       <tr>
           <td><code>{@link android.view.View#onFinishInflate()}</code></td>
           <td>Called after a view and all of its children has been inflated
           from XML.</td>
       </tr>
       
       <tr>
           <td rowspan="3">Layout</td>
           <td><code>{@link  android.view.View#onMeasure}</code></td>
           <td>Called to determine the size requirements for this view and all
           of its children.
           </td>
       </tr>
       <tr>
           <td><code>{@link  android.view.View#onLayout}</code></td>
           <td>Called when this view should assign a size and position to all
           of its children.
           </td>
       </tr>
       <tr>
           <td><code>{@link  android.view.View#onSizeChanged}</code></td>
           <td>Called when the size of this view has changed.
           </td>
       </tr>
       
       <tr>
           <td>Drawing</td>
           <td><code>{@link  android.view.View#onDraw}</code></td>
           <td>Called when the view should render its content.
           </td>
       </tr>
  
       <tr>
           <td rowspan="4">Event processing</td>
           <td><code>{@link  android.view.View#onKeyDown}</code></td>
           <td>Called when a new key event occurs.
           </td>
       </tr>
       <tr>
           <td><code>{@link  android.view.View#onKeyUp}</code></td>
           <td>Called when a key up event occurs.
           </td>
       </tr>   
       <tr>
           <td><code>{@link  android.view.View#onTrackballEvent}</code></td>
           <td>Called when a trackball motion event occurs.
           </td>
       </tr>  
       <tr>
           <td><code>{@link  android.view.View#onTouchEvent}</code></td>
           <td>Called when a touch screen motion event occurs.
           </td>
       </tr>  
       
       <tr>
           <td rowspan="2">Focus</td>
           <td><code>{@link  android.view.View#onFocusChanged}</code></td>
           <td>Called when the view gains or loses focus.
           </td>
       </tr>
       
       <tr>
           <td><code>{@link  android.view.View#onWindowFocusChanged}</code></td>
           <td>Called when the window containing the view gains or loses focus.
           </td>
       </tr>
       
       <tr>
           <td rowspan="3">Attaching</td>
           <td><code>{@link  android.view.View#onAttachedToWindow()}</code></td>
           <td>Called when the view is attached to a window.
           </td>
       </tr>
  
       <tr>
           <td><code>{@link  android.view.View#onDetachedFromWindow}</code></td>
           <td>Called when the view is detached from its window.
           </td>
       </tr>     
  
       <tr>
           <td><code>{@link  android.view.View#onWindowVisibilityChanged}</code></td>
           <td>Called when the visibility of the window containing the view
           has changed.
           </td>
       </tr>     
       </tbody>
       
   </table>



<h3 id="customexample">A Custom View Example</h3>
<p>The CustomView sample in the 
<a href="{@docRoot}resources/samples/ApiDemos/index.html">API Demos</a> provides an example
of a customized View. The custom View is defined in the
<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html">LabelView</a>
class.</p>
<p>The LabelView sample demonstrates a number of different aspects of custom components:</p>
<ul>
  <li>Extending the View class for a completely custom component.</li>
  <li>Parameterized constructor that takes the view inflation parameters
  (parameters defined in the XML). Some of these are passed through to the
  View superclass, but more importantly, there are some custom attributes defined
  and used for LabelView.</li>
  <li>Standard public methods of the type you would expect to see for a label
  component, for example <code>setText()</code>, <code>setTextSize()</code>,
  <code>setTextColor()</code> and so on.</li>
  <li>An overridden <code>onMeasure</code> method to determine and set the
  rendering size of the component. (Note that in LabelView, the real work is done
  by a private <code>measureWidth()</code> method.)</li>
  <li>An overridden <code>onDraw()</code> method to draw the label onto the
  provided canvas.</li>
</ul>
<p>You can see some sample usages of the LabelView custom View in
<a href="{@docRoot}resources/samples/ApiDemos/res/layout/custom_view_1.html">custom_view_1.xml</a>
from the samples. In particular, you can see a mix of both <code>android:</code>
namespace parameters and custom <code>app:</code> namespace parameters. These
<code>app:</code> parameters are the custom ones that the LabelView recognizes
and works with, and are defined in a styleable inner class inside of the
samples R resources definition class.</p>


<h2 id="compound">Compound Controls
</h2>
<p>If you don't want to create a completely customized component, but instead
are looking to put together a reusable component that consists of a group of
existing controls, then creating a Compound Component (or Compound Control) might
fit the bill. In a nutshell, this brings together a number of more atomic
controls (or views) into a logical group of items that can be treated as a
single thing. For example, a Combo Box can be thought of as a
combination of a single line EditText field and an adjacent button with an attached
 PopupList. If you press the button and select
something from the list, it populates the EditText field, but the user can
also type something directly into the EditText if they prefer.</p>
<p>In Android, there are actually two other Views readily available to do
this: {@link android.widget.Spinner Spinner} and 
{@link android.widget.AutoCompleteTextView AutoCompleteTextView}, but 
regardless, the concept of a Combo Box makes an easy-to-understand 
example.</p>
<p>To create a compound component:</p>
<ol>
  <li>
    The usual starting point is a Layout of some kind, so create a class
    that extends a Layout. Perhaps in the case of a Combo box we might use
    a LinearLayout with horizontal orientation. Remember that other layouts
    can be nested inside, so the compound component can be arbitrarily
    complex and structured. Note that just like with an Activity, you can
    use either the declarative (XML-based) approach to creating the
    contained components, or you can nest them programmatically from your
    code.
  </li>
  <li>
    In the constructor for the new class, take whatever parameters the
    superclass expects, and pass them through to the superclass constructor
    first. Then you can set up the other views to use within your new
    component; this is where you would create the EditText field and the
    PopupList. Note that you also might introduce your own attributes and
    parameters into the XML that can be pulled out and used by your
    constructor.
  </li>
  <li>
    You can also create listeners for events that your contained views might
    generate, for example, a listener method for the List Item Click Listener
    to update the contents of the EditText if a list selection is made.
  </li>
  <li>
    You might also create your own properties with accessors and modifiers,
    for example, allow the EditText value to be set initially in the
    component and query for its contents when needed.
  </li>
  <li>
    In the case of extending a Layout, you don't need to override the
    <code>onDraw()</code> and <code>onMeasure()</code> methods since the
    layout will have default behavior that will likely work just fine. However, 
    you can still override them if you need to.
  </li>
  <li>
    You might override other <code>on...</code> methods, like
    <code>onKeyDown()</code>, to perhaps choose certain default values from
    the popup list of a combo box when a certain key is pressed.
  </li>
</ol>
<p>
 To summarize, the use of a Layout as the basis for a Custom Control has a
number of advantages, including:</p>
 
<ul>
  <li>
    You can specify the layout using the declarative XML files just like
    with an activity screen, or you can create views programmatically and
    nest them into the layout from your code.
  </li>
  <li>
    The <code>onDraw()</code> and <code>onMeasure()</code> methods (plus
    most of the other <code>on...</code> methods) will likely have suitable behavior so
    you don't have to override them.
  </li>
  <li>
    In the end, you can very quickly construct arbitrarily complex compound
    views and re-use them as if they were a single component.
  </li>
</ul>
<h4>Examples of Compound Controls</h4>
<p>In the API Demos project
 that comes with the SDK, there are two List
 examples &mdash; Example 4 and Example 6 under Views/Lists demonstrate a
 SpeechView which extends LinearLayout to make a component for displaying
 Speech quotes. The corresponding classes in the sample code are
 <code>List4.java</code> and <code>List6.java</code>.</p>
 


<h2 id="modifying">Modifying an Existing View Type</h2>
<p>There is an even easier option for creating a custom View which is
useful in certain circumstances. If there is a component that is already very
similar to what you want, you can simply extend that component and just
override the behavior that you want to change. You can do all of the things
you would do with a fully customized component, but by starting with a more
specialized class in the View hierarchy, you can also get a lot of behavior for
free that probably does exactly what you want.</p>
<p>For example, the SDK includes a <a
href="{@docRoot}resources/samples/NotePad/index.html">NotePad application</a> in the
samples. This demonstrates many aspects of using the Android platform, among
them is extending an EditText View to make a lined notepad. This is not a
perfect example, and the APIs for doing this might change from this early
preview, but it does demonstrate the principles.</p>
<p>If you haven't done so already, import the 
NotePad sample into Eclipse (or
just look at the source using the link provided). In particular look at the definition of
<code>MyEditText</code> in the <a
href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">NoteEditor.java</a>
file.</p>
<p>Some points to note here</p>
<ol>
  <li>
    <strong>The Definition</strong>
    <p>The class is defined with the following line:<br/>
     <code>public static class MyEditText extends EditText</code></p>
     
    <ul>
      <li>
        It is defined as an inner class within the <code>NoteEditor</code>
        activity, but it is public so that it could be accessed as
        <code>NoteEditor.MyEditText</code> from outside of the <code>NoteEditor</code>
        class if desired.
      </li>
      <li>
        It is <code>static</code>, meaning it does not generate the so-called
        "synthetic methods" that allow it to access data from the parent
        class, which in turn means that it really behaves as a separate
        class rather than something strongly related to <code>NoteEditor</code>.
        This is a cleaner way to create inner classes if they do not need
        access to state from the outer class, keeps the generated class
        small, and allows it to be used easily from other classes.
      </li>
      <li>
        It extends <code>EditText</code>, which is the View we have chosen to
        customize in this case. When we are finished, the new class will be
        able to substitute for a normal <code>EditText</code> view.
      </li>
    </ul>
  </li>
  <li>
    <strong>Class Initialization</strong>
    <p>As always, the super is called first. Furthermore, 
    this is not a default constructor, but a parameterized one. The
    EditText is created with these parameters when it is inflated from an
    XML layout file, thus, our constructor needs to both take them and pass them
    to the superclass constructor as well.</p>
  </li>
  <li>
    <strong>Overridden Methods</strong>
    <p>In this example, there is only one method to be overridden: 
    <code>onDraw()</code> &mdash; but there could easily be others needed when you
    create your own custom components.</p>
    <p>For the NotePad sample, overriding the <code>onDraw()</code> method allows
    us to paint the blue lines on the <code>EditText</code> view canvas (the
    canvas is passed into the overridden <code>onDraw()</code> method). The
    super.onDraw() method is called before the method ends. The
    superclass method should be invoked, but in this case, we do it at the
    end after we have painted the lines we want to include.</p>
  <li>
    <strong>Use the Custom Component</strong>
    <p>We now have our custom component, but how can we use it? In the
    NotePad example, the custom component is used directly from the
    declarative layout, so take a look at <code>note_editor.xml</code> in the
    <code>res/layout</code> folder.</p>
<pre>
&lt;view
  class=&quot;com.android.notepad.NoteEditor$MyEditText&quot; 
  id=&quot;&#64;+id/note&quot;
  android:layout_width=&quot;fill_parent&quot;
  android:layout_height=&quot;fill_parent&quot;
  android:background=&quot;&#64;android:drawable/empty&quot;
  android:padding=&quot;10dip&quot;
  android:scrollbars=&quot;vertical&quot;
  android:fadingEdge=&quot;vertical&quot; /&gt;
</pre>
     
    <ul>
      <li>
        The custom component is created as a generic view in the XML, and
        the class is specified using the full package. Note also that the
        inner class we defined is referenced using the
        <code>NoteEditor$MyEditText</code> notation which is a standard way to
        refer to inner classes in the Java programming language.
        <p>If your custom View component is not defined as an inner class, then you can,
        alternatively, declare the View component 
        with the XML element name, and exclude the <code>class</code> attribute. For example:</p>
<pre>
&lt;com.android.notepad.MyEditText
  id=&quot;&#64;+id/note&quot;
  ... />
</pre>
      <p>Notice that the <code>MyEditText</code> class is now a separate class file. When the class
      is nested in the <code>NoteEditor</code> class, this technique will not work.</p>
      </li>
      <li>
        The other attributes and parameters in the definition are the ones
        passed into the custom component constructor, and then passed
        through to the EditText constructor, so they are the same
        parameters that you would use for an EditText view. Note that it is
        possible to add your own parameters as well, and we will touch on
        this again below.
      </li>
    </ul>
  </li>
</ol>
<p>And that's all there is to it. Admittedly this is a simple case, but
that's the point &mdash; creating custom components is only as complicated as you
need it to be.</p>
<p>A more sophisticated component may override even more <code>on...</code> methods and
introduce some of its own helper methods, substantially customizing its properties and
behavior. The only limit is your imagination and what you need the component to
do.</p>

