选择按钮
选择按钮
CheckBox
CompoundButton
在Android体系中,CompoundButton类是抽象的复合按钮,因为是抽象类,所以不能直接使用。 实际开发中用的是CompoundButton类的几个派生类,主要有复选框CheckBox、单选按钮RadioButton以及开关按钮Switch,这些派生类都可使用CompoundButton的属性和方法。CompoundButton在布局文件中主要使用下面两个属性。
checked:指定按钮的勾选状态,true表示勾选,false表示未勾选。默认未勾选。
button:指定左侧勾选图标的图形。如果不指定就使用系统的默认图标。
# CompoundButton在代码中可使用下列4种方法进行设置。
setChecked:设置按钮的勾选状态。
setButtonDrawable:设置左侧勾选图标的图形。
setOnCheckedChangeListener:设置勾选状态变化的监听器。
isChecked:判断按钮是否勾选。
CheckBox
复选框CheckBox是CompoundButton一个最简单的实现,点击复选框勾选,再次点击取消勾选。 CheckBox通过setOnCheckedChangeListener方法设置勾选监听器,对应的监听器要实现接口CompoundButton.OnCheckedChangeListener。
代码示例:
// 该页面实现了接口OnCheckedChangeListener,意味着要重写勾选监听器的onCheckedChanged方法
public class CheckBoxActivity extends AppCompatActivity
implements CompoundButton.OnCheckedChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_box);
// 从布局文件中获取名叫ck_system的复选框
CheckBox ck_system = findViewById(R.id.ck_system);
// 从布局文件中获取名叫ck_custom的复选框
CheckBox ck_custom = findViewById(R.id.ck_custom);
// 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法
ck_system.setOnCheckedChangeListener(this);
// 给ck_custom设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法
ck_custom.setOnCheckedChangeListener(this);
// 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法
//ck_system.setOnCheckedChangeListener(new CheckListener());
// 给ck_custom设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法
//ck_custom.setOnCheckedChangeListener(new CheckListener());
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String desc = String.format("您%s了这个CheckBox", isChecked ? "勾选" : "取消勾选");
buttonView.setText(desc);
}
// 定义一个勾选监听器,它实现了接口CompoundButton.OnCheckedChangeListener
private class CheckListener implements CompoundButton.OnCheckedChangeListener{
// 在用户点击复选框时触发
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String desc = String.format("您勾选了控件%d,状态为%b", buttonView.getId(), isChecked);
Toast.makeText(CheckBoxActivity.this, desc, Toast.LENGTH_LONG).show();
}
}
}
Switch
Switch是开关按钮,Android从4.0版本开始支持该控件。其实Switch是一个高级版本的CheckBox,在选中与取消选中时可展现的界面元素比CheckBox丰富。
Switch新添加的属性和设置方法如下:
XML中的属性 | 代码设置的方法 | 说明 |
---|---|---|
textOn | setTextOn | 设置开启时的文本 |
textOff | setTextOff | 设置关闭时的文本 |
switchPadding | setSwitchPadding | 设置左右两个开关按钮之间的距离 |
thumbTextPadding | setThumbTextPadding | 设置文本左右两边的距离。如果这个值设置了switchPadding 属性会失效 |
thumb | setThumbDrable/Resource | 设置开关轨道的背景 |
track | setTrackDrable/Resource | 设置开关标识的图标 |
public class SwitchDefaultActivity extends AppCompatActivity implements OnCheckedChangeListener {
private Switch sw_status; // 声明一个开关按钮对象
private TextView tv_result; // 声明一个文本视图对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switch_default);
// 从布局文件中获取名叫sw_status的开关按钮
sw_status = findViewById(R.id.sw_status);
// 从布局文件中获取名叫tv_result的文本视图
tv_result = findViewById(R.id.tv_result);
// 给开关按钮设置选择监听器,一旦用户点击它,就触发监听器的onCheckedChanged方法
sw_status.setOnCheckedChangeListener(this);
refreshResult(); // 刷新Switch按钮的开关说明
}
// 刷新Switch按钮的开关说明
private void refreshResult() {
String result = String.format("Switch按钮的状态是%s",
(sw_status.isChecked()) ? "开" : "关");
tv_result.setText(result);
}
// 选择事件的处理方法
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
refreshResult();
}
}
RadioButton
单选按钮要在一组按钮中选择其中一项,并且不能多选,这要求有个容器确定这组按钮的范围,这个容器便是RadioGroup。
RadioGroup实质上是个布局,同一组RadioButton都要放在同一个RadioGroup节点下。RadioGroup有orientation属性可指定下级控件的排列方向,该属性为horizontal时,单选按钮在水平方向排列;该属性为vertical时,单选按钮在垂直方向排列。RadioGroup下面除了RadioButton,还可以挂载其他子控件(如TextView、ImageView等)。
RadioGroup就是一个特殊的线性布局,只不过多了管理单选按钮的功能。下面是RadioGroup常用的3个方法。
check:选中指定资源编号的单选按钮。
getCheckedRadioButtonId:获取选中状态单选按钮的资源编号。
setOnCheckedChangeListener:设置单选按钮勾选变化的监听器。
RadioButton默认未选中,点击后显示选中,但是再次点击不会取消选中。只有点击同组的其他单选按钮时,原来选中的单选按钮才会取消选中。
另外,单选按钮的选中事件一般不由RadioButton处理,而是由RadioGroup响应。选中事件在实现时,首先要写一个单选监听器实现接口RadioGroup.OnCheckedChangeListener,然后调用RadioGroup对象的setOnCheckedChangeListener方法注册该监听器。
- tip: RadioButton经常会更换按钮图标,如果通过button属性变更图标,那么图标与文字就会挨得很近,为了拉开图标与文字之间的距离,得换成drawableLeft属性展示新图标(不要忘了把button改为@null),此时再设置drawablePadding即可指定间隔距离。
button:主要用于图标大小要求不高,间隔要求也不高的场合。
background:主要用于能够以较大空间显示图标的场合。
drawableLeft:主要用于对图标与文字之间的间隔有要求的场合。
代码示例:
// 该页面实现了接口OnCheckedChangeListener,意味着要重写选中监听器的onCheckedChanged方法
public class RadioHorizontalActivity extends AppCompatActivity
implements RadioGroup.OnCheckedChangeListener {
private TextView tv_sex; // 声明一个文本视图对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radio_horizontal);
// 从布局文件中获取名叫tv_sex的文本视图
tv_sex = findViewById(R.id.tv_sex);
// 从布局文件中获取名叫rg_sex的单选组
RadioGroup rg_sex = findViewById(R.id.rg_sex);
// 设置单选监听器,一旦点击组内的单选按钮,就触发监听器的onCheckedChanged方法
rg_sex.setOnCheckedChangeListener(this);
// 设置单选监听器,一旦点击组内的单选按钮,就触发监听器的onCheckedChanged方法
//rg_sex.setOnCheckedChangeListener(new RadioListener());
}
// 在用户点击组内的单选按钮时触发
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.rb_male) {
tv_sex.setText("哇哦,你是个帅气的男孩");
} else if (checkedId == R.id.rb_female) {
tv_sex.setText("哇哦,你是个漂亮的女孩");
}
}
// 定义一个单选监听器,它实现了接口RadioGroup.OnCheckedChangeListener
class RadioListener implements RadioGroup.OnCheckedChangeListener{
// 在用户点击组内的单选按钮时触发
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
Toast.makeText(RadioHorizontalActivity.this, "您选中了控件"+checkedId, Toast.LENGTH_LONG).show();
}
}
}