Home | History | Annotate | Download | only in views
      1 page.title=Hello, Form Stuff
      2 parent.title=Hello, Views
      3 parent.link=index.html
      4 @jd:body
      5 
      6 <p>This page introduces a variety of widgets, like image buttons,
      7 text fields, checkboxes and radio buttons.</p>
      8 
      9 
     10 <ol>
     11   <li>Start a new project/Activity called HelloFormStuff.</li>
     12   <li>Your layout file should have a basic LinearLayout:
     13     <pre>
     14 &lt;?xml version="1.0" encoding="utf-8"?>
     15 &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     16     android:orientation="vertical"
     17     android:layout_width="fill_parent"
     18     android:layout_height="fill_parent" >
     19     	
     20 &lt;/LinearLayout>
     21 </pre>
     22     <p>For each widget you want to add, just put the respective View inside here.</p>
     23 </li>
     24 </ol>
     25 <p class="note"><strong>Tip:</strong> As you add new Android code, press Ctrl(or Cmd) + Shift + O 
     26 to import all needed packages.</p>
     27 
     28 
     29 <h2>ImageButton</h2>
     30 <p>A button with a custom image on it. 
     31 We'll make it display a message when pressed.</p>
     32 <ol>
     33   <li><img src="images/android.png" align="right"/>
     34 	Drag the Android image on the right (or your own image) into the
     35 	res/drawable/ directory of your project. 
     36         We'll use this for the button.</li>
     37   <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.ImageButton} element:
     38 <pre>
     39 &lt;ImageButton
     40     android:id="@+id/android_button"
     41     android:layout_width="100dip"
     42     android:layout_height="wrap_content"
     43     android:src="@drawable/android" />	
     44 </pre>
     45 	<p>The source of the button
     46 	is from the res/drawable/ directory, where we've placed the android.png.</p>
     47         <p class="note"><strong>Tip:</strong> You can also reference some of the many built-in
     48         images from the Android {@link android.R.drawable} resources, 
     49         like <code>ic_media_play</code>, for a "play" button image. To do so, change the source
     50         attribute to <code>android:src="@android:drawable/ic_media_play"</code>.</p>
     51 </li>
     52 <li>To make the button to actually do something, add the following
     53 code at the end of the <code>onCreate()</code> method:
     54 <pre>
     55 final ImageButton button = (ImageButton) findViewById(R.id.android_button);
     56 button.setOnClickListener(new OnClickListener() {
     57     public void onClick(View v) {
     58         // Perform action on clicks
     59         Toast.makeText(HelloFormStuff.this, "Beep Bop", Toast.LENGTH_SHORT).show();
     60     }
     61 });
     62 </pre>
     63 <p>This captures our ImageButton from the layout, then adds an on-click listener to it.
     64 The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
     65 defines the action to be made when the button is clicked. Here, we show a 
     66 {@link android.widget.Toast} message when clicked.</p>
     67 </li>
     68 <li>Run it.</li>
     69 </ol>
     70 
     71 
     72 <h2>EditText</h2>
     73 <p>A text field for user input. We'll make it display the text entered so far when the "Enter" key is pressed.</p>
     74 
     75 <ol>
     76   <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.EditText} element:
     77 <pre>
     78 &lt;EditText
     79     android:id="@+id/edittext"
     80     android:layout_width="fill_parent"
     81     android:layout_height="wrap_content"/>
     82 </pre>
     83 </li>
     84 <li>To do something with the text that the user enters, add the following code
     85 to the end of the <code>onCreate()</code> method:
     86 <pre>
     87 final EditText edittext = (EditText) findViewById(R.id.edittext);
     88 edittext.setOnKeyListener(new OnKeyListener() {
     89     public boolean onKey(View v, int keyCode, KeyEvent event) {
     90         if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
     91           // Perform action on key press
     92           Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
     93           return true;
     94         }
     95         return false;
     96     }
     97 });
     98 </pre>
     99 <p>This captures our EditText element from the layout, then adds an on-key listener to it.
    100 The {@link android.view.View.OnKeyListener} must define the <code>onKey()</code> method, which
    101 defines the action to be made when a key is pressed. In this case, we want to listen for the
    102 Enter key (when pressed down), then pop up a {@link android.widget.Toast} message with the 
    103 text from the EditText field. Be sure to return <var>true</var> after the event is handled, 
    104 so that the event doesn't bubble-up and get handled by the View (which would result in a
    105 carriage return in the text field).</p>
    106 <li>Run it.</li>
    107 </ol>
    108 
    109 
    110 <h2>CheckBox</h2>
    111 <p>A checkbox for selecting items. We'll make it display the the current state when pressed.</p>
    112 
    113 <ol>
    114   <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.CheckBox} element:
    115 <pre>
    116 &lt;CheckBox android:id="@+id/checkbox"
    117     android:layout_width="wrap_content"
    118     android:layout_height="wrap_content"
    119     android:text="check it out" />
    120 </pre>
    121 </li>
    122 <li>To do something when the state is changed, add the following code
    123 to the end of the <code>onCreate()</code> method:
    124 <pre>
    125 final CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox);
    126 checkbox.setOnClickListener(new OnClickListener() {
    127     public void onClick(View v) {
    128         // Perform action on clicks
    129         if (checkbox.isChecked()) {
    130             Toast.makeText(HelloFormStuff.this, "Selected", Toast.LENGTH_SHORT).show();
    131         } else {
    132             Toast.makeText(HelloFormStuff.this, "Not selected", Toast.LENGTH_SHORT).show();
    133         }
    134     }
    135 });
    136 </pre>
    137 <p>This captures our CheckBox element from the layout, then adds an on-click listener to it.
    138 The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
    139 defines the action to be made when the checkbox is clicked. Here, we query the current state of the
    140 checkbox, then pop up a {@link android.widget.Toast} message that displays the current state. 
    141 Notice that the CheckBox handles its own state change between checked and un-checked, so we just
    142 ask which it currently is.</p>
    143 <li>Run it.</li>
    144 </ol>
    145 <p class="note"><strong>Tip:</strong> If you find that you need to change the state
    146 in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
    147 use <code>setChecked(true)</code> or <code>toggle()</code>.</p>
    148 
    149 
    150 <h2>RadioButton</h2>
    151 <p>Two mutually-exclusive radio buttons&mdash;enabling one disables the other. 
    152 When each is pressed, we'll pop up a message.</p>
    153 
    154 <ol>
    155   <li>Open the layout file and, inside the LinearLayout, add two {@link android.widget.RadioButton}s,
    156 inside a {@link android.widget.RadioGroup}:
    157 <pre>
    158 &lt;RadioGroup
    159   android:layout_width="fill_parent"
    160   android:layout_height="wrap_content"
    161   android:orientation="vertical">
    162   
    163   &lt;RadioButton android:id="@+id/radio_red"
    164       android:layout_width="wrap_content"
    165       android:layout_height="wrap_content"
    166       android:text="Red" />
    167   
    168   &lt;RadioButton android:id="@+id/radio_blue"
    169       android:layout_width="wrap_content"
    170       android:layout_height="wrap_content"
    171       android:text="Blue" />
    172   
    173 &lt;/RadioGroup>
    174 </pre>
    175 </li>
    176 <li>To do something when each is selected, we'll need an OnClickListener. Unlike the other 
    177 listeners we've created, instead of creating this one as an anonymous inner class, 
    178 we'll create it as a new object. This way, we can re-use the OnClickListener for 
    179 both RadioButtons. So, add the following code in the HelloFormStuff Activity
    180 (<em>outside</em> the <code>onCreate()</code> method):
    181 <pre>
    182 OnClickListener radio_listener = new OnClickListener() {
    183     public void onClick(View v) {
    184         // Perform action on clicks
    185         RadioButton rb = (RadioButton) v;
    186         Toast.makeText(HelloFormStuff.this, rb.getText(), Toast.LENGTH_SHORT).show();
    187     }
    188 };
    189 </pre>
    190 <p>Our <code>onClick()</code> method will be handed the View clicked, so the first thing to do
    191 is cast it into a RadioButton. Then we pop up a 
    192 {@link android.widget.Toast} message that displays the selection.</p>
    193 <li>Now, at the bottom of the <code>onCreate()</code> method, add the following:
    194 <pre>
    195   final RadioButton radio_red = (RadioButton) findViewById(R.id.radio_red);
    196   final RadioButton radio_blue = (RadioButton) findViewById(R.id.radio_blue);
    197   radio_red.setOnClickListener(radio_listener);
    198   radio_blue.setOnClickListener(radio_listener);
    199 </pre>
    200 <p>This captures each of the RadioButtons from our layout and adds the newly-created 
    201 OnClickListener to each.</p>
    202 <li>Run it.</li>
    203 </ol>
    204 <p class="note"><strong>Tip:</strong> If you find that you need to change the state of a
    205 RadioButton in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
    206 use <code>setChecked(true)</code> or <code>toggle()</code>.</p>
    207 
    208 
    209 <h2>ToggleButton</h2>
    210 <p>A button used specifically for toggling something on and off.</p>
    211 
    212 <ol>
    213   <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.ToggleButton} element:
    214 <pre>
    215 &lt;ToggleButton android:id="@+id/togglebutton"
    216     android:layout_width="wrap_content"
    217     android:layout_height="wrap_content" />
    218 </pre>
    219 </li>
    220 <li>To do something when the state is changed, add the following code
    221 to the end of the <code>onCreate()</code> method:
    222 <pre>
    223 final ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton);
    224 togglebutton.setOnClickListener(new OnClickListener() {
    225     public void onClick(View v) {
    226         // Perform action on clicks
    227         if (togglebutton.isChecked()) {
    228             Toast.makeText(HelloFormStuff.this, "ON", Toast.LENGTH_SHORT).show();
    229         } else {
    230             Toast.makeText(HelloFormStuff.this, "OFF", Toast.LENGTH_SHORT).show();
    231         }
    232     }
    233 });
    234 </pre>
    235 <p>This captures our ToggleButton element from the layout, then adds an on-click listener to it.
    236 The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
    237 defines the action to be made when the button is clicked. Here, we query the current state of the
    238 ToggleButton, then pop up a {@link android.widget.Toast} message that displays the current state. 
    239 Notice that the ToggleButton handles its own state change between checked and un-checked, so we just
    240 ask which it is.</p>
    241 <li>Run it.</li>
    242 </ol>
    243 
    244 <p class="note"><strong>Tip:</strong> By default, the text on the button is "ON" and "OFF", but 
    245 you can change each of these with <code>setTextOn(<var>CharSequence</var>)</code> and 
    246 <code>setTextOff(<var>CharSequence</var>)</code>. And, if you find that you need to change the state
    247 in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
    248 use <code>setChecked(true)</code> or <code>toggle()</code>. </p>
    249 
    250 
    251 <p>If you've added all the form items above, your application should look something like this:</p>
    252 <img src="images/hello-formstuff.png" width="150px" />
    253 
    254 <h3>References</h3>
    255 <ul>
    256 	<li>{@link android.widget.ImageButton}</li>
    257 	<li>{@link android.widget.EditText}</li>
    258 	<li>{@link android.widget.CheckBox}</li>
    259 	<li>{@link android.widget.RadioButton}</li>
    260 	<li>{@link android.widget.ToggleButton}</li>
    261 </ul>
    262 
    263