单选按钮是Android中比较普通同时也是比较常见的组件。RadioButton单选按钮是一种双状态的按钮,可以选择或不选中。在单选按钮没有被选中时,用户能够按下或点击来选中它。但是,与复选框相反,用户一旦选中就不能够通过界面取消选中,但是可以通过代码来取消选中状态。

RadioGroup用于创建一组选中状态相互排斥的单选按钮组。一个组中,只有一个按钮可以被选中,选中了一个RadioButton会自动取消其它按钮的选中状态 。初始状态下,所有的单选按钮都未勾选,虽然不能取消一个特定的单选按钮的勾选状态,但可以通过单选按钮组去消除它的勾选状态。RadioGroup和 RadioButton通常是放在一起使用的。

RadioGroup.OnCheckedChangeListener是当单选按钮组中的单选 按钮的勾选状态发生改变时,所要调用的回调函数的接口类。当我们希望当 RadioGroup中的RadioButton按钮的选中状态改变时执行相应的操作,为 RadioGroup添加监听器。在这个类中我们需要复写public void onCheckedChanged(RadioGroup group, int checkedId)方法,这个方法的两个参数分别为传递进来的组以及组中选中的RadioButton的id。我们可以通过这个 id来判断哪一个按钮被选中,从而执行相应的操作。下面我们通过一个例子来演示RadioGroup和RadioButton 的使用。在这个例子中,我们有两个RadioGroup分别对应国家和城市,当国家改变时,城市也随着改变,当我们选择城市后,则显示我们选取的国家和城市。运行效果如下:

下面是涉及的相关布局文件和代码,

main.xml:

<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>
 <LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;fill_parent&quot;
    android:orientation=&quot;vertical&quot; >

     <TextView
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;@string/tv_Country&quot; />
     <RadioGroup
        android:id=&quot;@+id/rg_Country&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;>
         <RadioButton android:id=&quot;@+id/cn&quot; android:text=&quot;@string/cn&quot;/>
         <RadioButton android:id=&quot;@+id/us&quot; android:text=&quot;@string/us&quot;/>
         <RadioButton android:id=&quot;@+id/uk&quot; android:text=&quot;@string/uk&quot;/>
     </RadioGroup>
	 <TextView
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;@string/tv_City&quot; />
     <RadioGroup
        android:id=&quot;@+id/rg_City&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;>
         <RadioButton android:id=&quot;@+id/city_1&quot; android:text=&quot;@string/cn_bj&quot;/>
         <RadioButton android:id=&quot;@+id/city_2&quot; android:text=&quot;@string/cn_sh&quot;/>
         <RadioButton android:id=&quot;@+id/city_3&quot; android:text=&quot;@string/cn_gd&quot;/>
     </RadioGroup>
 </LinearLayout>

string.xml:

<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>
 <resources>

     <string name=&quot;hello&quot;> Hello World, RadioButtonDemoActivity! </string>
     <string name=&quot;app_name&quot;> RadioButtonDemo </string>
     <string name=&quot;tv_Country&quot;> 请选择国家: </string>
     <string name=&quot;tv_City&quot;> 请选择城市: </string>
	 <string name=&quot;cn&quot;> 中国 </string>
	 <string name=&quot;us&quot;> 美国 </string>
	 <string name=&quot;uk&quot;> 英国 </string>
	 <string name=&quot;cn_bj&quot;> 北京 </string>
	 <string name=&quot;cn_sh&quot;> 上海 </string>
	 <string name=&quot;cn_gd&quot;> 广东 </string>
	 <string name=&quot;us_NewYork&quot;> New York </string>
	 <string name=&quot;us_Boston&quot;> Boston </string>
	 <string name=&quot;us_Chicago&quot;> Chicago </string>
	 <string name=&quot;uk_London&quot;> London </string>
	 <string name=&quot;uk_Manchester&quot;> Manchester </string>
	 <string name=&quot;uk_Birmingham&quot;> Birmingham </string>
 </resources>

RadioButtonDemoActivity.java:

package com.liuzhichao.RadioButton;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

public class RadioButtonDemoActivity extends Activity {

	private RadioGroup rg_CountryGroup;
	private RadioGroup rg_CityGroup;
	private RadioButton rb_city1;
	private RadioButton rb_city2;
	private RadioButton rb_city3;
	private String str_Country;   //选择的国家
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//通过ID实例化控件
		rg_CountryGroup = (RadioGroup) findViewById(R.id.rg_Country);
		rg_CityGroup = (RadioGroup) findViewById(R.id.rg_City);
		rb_city1 = (RadioButton) findViewById(R.id.city_1);
		rb_city2 = (RadioButton) findViewById(R.id.city_2);
		rb_city3 = (RadioButton) findViewById(R.id.city_3);

		//设置国家RadioGroup事件
		rg_CountryGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					public void onCheckedChanged(RadioGroup group, int checkedId) {
						setCityGroupCityText(checkedId);//改变城市里单选框的标题

						RadioButton mRadioButton = (RadioButton) findViewById(checkedId);
						str_Country = mRadioButton.getText().toString(); //保存选择的国家
					}
				});

		//设置 城市RadioGroup事件
		rg_CityGroup.setOnCheckedChangeListener(new  OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				RadioButton mRadioButton = (RadioButton) findViewById(checkedId);
				//采用Toast显示选择的国家和城市
				Toast.makeText(getApplicationContext(),
						&quot;你的选择是:&quot;+str_Country+&quot;-&quot;+mRadioButton.getText().toString(), 1).show();
			}
		});
	}

	/**
	 * 改变城市里单选框的标题
	 * @param id 选择的国家单选按钮ID
	 */
	private void setCityGroupCityText(int id) {
		switch (id) {
		case R.id.cn:
			rb_city1.setText(R.string.cn_bj);
			rb_city2.setText(R.string.cn_sh);
			rb_city3.setText(R.string.cn_gd);
			break;
		case R.id.us:
			rb_city1.setText(R.string.us_NewYork);
			rb_city2.setText(R.string.us_Boston);
			rb_city3.setText(R.string.us_Chicago);
			break;
		case R.id.uk:
			rb_city1.setText(R.string.uk_London);
			rb_city2.setText(R.string.uk_Manchester);
			rb_city3.setText(R.string.uk_Birmingham);
			break;
		}
	}
}