1. Turn the Radio Up
As with other implementations of radio buttons in
other toolkits, Android's radio buttons are two-state, like check boxes,
but can be grouped such that only one radio button in the group can be
checked at any time.
Like CheckBox, RadioButton inherits from CompoundButton, which in turn inherits from TextView. Hence, all the standard TextView
properties for font face, style, color, and so forth are available for
controlling the look of radio buttons. Similarly, you can call isChecked() on a RadioButton to see if it is selected, toggle() to select it, and so on, as you can with a CheckBox.
Most times, you will want to put your RadioButton widgets inside a RadioGroup. The RadioGroup
indicates a set of radio buttons whose state is tied, meaning only one
button in the group can be selected at any time. If you assign an android:id to your RadioGroup in your XML layout, you can access the group from your Java code and invoke the following:
check(): Checks a specific radio button via its ID (e.g., group.check(R.id.radio1))
clearCheck(): Clears all radio buttons, so none in the group are checked
getCheckedRadioButtonId(): Gets the ID of the currently checked radio button (or −1 if none are checked)
Note that the mutual-exclusion feature of RadioGroup applies only to RadioButton widgets that are immediate children of the RadioGroup. You cannot have other containers between the RadioGroup and its RadioButton widgets.
For example, from the Basic/RadioButton sample application, here is an XML layout showing a RadioGroup wrapping a set of RadioButton widgets:
<?xml version="1.0" encoding="utf-8"?>
<RadioGroup
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RadioButton android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rock" />
<RadioButton android:id="@+id/radio2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scissors" />
<RadioButton android:id="@+id/radio3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Paper" />
</RadioGroup>
Using the stock Android-generated Java for the project and this layout, you get the result shown in Figure 1.
Note that the radio button group is initially set to
be completely unchecked at the outset. To preset one of the radio
buttons to be checked, use either setChecked() on the RadioButton or check() on the RadioGroup from within your onCreate() callback in your activity.
2. It's Quite a View
All widgets, including the ones shown in the previous sections, extend View, which gives all widgets an array of useful properties and methods beyond those already described.
2.1. Padding
Widgets have a minimum size, which may be influenced by what is inside of them. So, for example, a Button
will expand to accommodate the size of its caption. You can control
this size by using padding. Adding padding will increase the space
between the contents (e.g., the caption of a Button) and the edges of the widget.
Padding can be set once in XML for all four sides (android:padding) or on a per-side basis (android:paddingLeft, etc.). Padding can also be set in Java via the setPadding() method.
The value of any of these is a dimension, a combination of a unit of measure and a count. So, 5px is 5 pixels, 10dip is 10 density-independent pixels, and 2mm is 2 millimeters.
2.2. Other Useful Properties
Some of the other properties on View that are most likely to be used include the following:
android: visibility: Controls whether the widget is initially visible
android:nextFocusDown, android:nextFocusLeft, android:nextFocusRight, and android:nextFocusUp: Control the focus order if the user uses the D-pad, trackball, or similar pointing device
android:contentDescription: Roughly equivalent to the alt attribute on an HTML <img> tag, used by accessibility tools to help people who cannot see the screen navigate the application
2.3. Useful Methods
You can toggle whether or not a widget is enabled via setEnabled() and see if it is enabled via isEnabled(). One common use pattern for this is to disable some widgets based on a CheckBox or RadioButton selection.
You can give a widget focus via requestFocus() and see if it is focused via isFocused().
You might use this in concert with disabling widgets to ensure the
proper widget has the focus once your disabling operation is complete.
To help navigate the tree of widgets and containers that make up an activity's overall view, you can use:
getParent(): Finds the parent widget or container
findViewById(): Finds a child widget with a certain ID
getRootView(): Gets the root of the tree (e.g., what you provided to the activity via setContentView())
2.4. Colors
There are two types of color attributes in Android widgets. Some, like android:background, take a single color (or a graphic image to serve as the background). Others, like android:textColor on TextView (and subclasses), can take a ColorStateList, including via the Java setter (in this case, setTextColor()).
A ColorStateList allows you to specify different colors for different conditions. For example, a TextView can have one text color when it is the selected item in a list and another color when it is not selected. This is handled via the default ColorStateList associated with TextView.
If you wish to change the color of a TextView widget in Java code, you have two main choices:
Use ColorStateList.valueOf(), which returns a ColorStateList in which all states are considered to have the same color, which you supply as the parameter to the valueOf() method. This is the Java equivalent of the android:textColor approach, to make the TextView always a specific color regardless of circumstances.
Create a ColorStateList
with different values for different states, either via the constructor
or via an XML drawable resource.