选择按钮

qiang.zhang大约 6 分钟

选择按钮

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中的属性代码设置的方法说明
textOnsetTextOn设置开启时的文本
textOffsetTextOff设置关闭时的文本
switchPaddingsetSwitchPadding设置左右两个开关按钮之间的距离
thumbTextPaddingsetThumbTextPadding设置文本左右两边的距离。如果这个值设置了switchPadding 属性会失效
thumbsetThumbDrable/Resource设置开关轨道的背景
tracksetTrackDrable/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();
        }
    }
}

Loading...