##1· 什么是多选按钮? 像这样可以选中多个选项的按钮就叫多选按钮(CheckBox)。
##2· 如何来使用多选按钮?
###2.1· 添加多选按钮 编译器通过不同的id来区分CheckBox,因此要注意id的命名。 XML布局文件:
###2.2· 生成并获取多选按钮 JAVA代码: 首先将这些多选按钮声明为成员变量。
private CheckBox eatBox; private CheckBox sleepBox; private CheckBox codBox; private CheckBox allBox;
然后找到其对应的组件ID
eatBox = (CheckBox) findViewById(R.id.eatBox); sleepBox = (CheckBox) findViewById(R.id.sleepBox); codBox = (CheckBox) findViewById(R.id.codBox); allBox = (CheckBox) findViewById(R.id.allBox);
###2.3· 对多选按钮进行监听 什么时候需要监听:
当按钮被选中时; 当按钮未选中时;
老师介绍了两种监听方法:
-
内部类实现接口OnClickListener的onClick(View view)方法;
-
内部类实现接口OnCheckedChangeListener的onCheckedChanged(CompoundButton boxButton, boolean isChecked) 方法;
3· 两个方法最明显的区别就是传递参数不同:
前者传递一个View,后者传递一个CompoundButton(它是CheckBox等拥有两种状态的抽象的父类)和一个布尔值。这个布尔值代表所点击的选项的状态。
- onClick方法是在选项被单击的时候调用;
- onCheckedChanged方法是在选项状态改变的时候调用;
先创建一个内部类来实现监听器接口,重写指定方法: 做法1:
class BoxOnClickListener implements OnClickListener{ public void onClick(View view) { } }
按钮只要被点击,就会执行onClick方法。 这里我们要实现的是:知道具体哪一个按钮被选中还是被取消选中。
CheckBox box = (CheckBox) view;//view向下转型为CheckBox switch(box.getId()){//通过id来判断操作的是哪一个CheckBox case R.id.eatBox: if(box.isChecked()) {//通过该方法来判断CheckBox选中与否 System.out.println("eatBox is checked"); } else { System.out.println("eatBox is unchecked"); } break; case R.id.sleepBox: if(box.isChecked()) { System.out.println("sleepBox is checked"); } else { System.out.println("sleepBox is unchecked"); } break; case R.id.codBox: if(box.isChecked()) { System.out.println("codBox is checked"); } else { System.out.println("codBox is unchecked"); } break; case R.id.allBox: if(box.isChecked()) { System.out.println("allBox is checked"); } else { System.out.println("allBox is unchecked"); } break; }
监听器类写好之后,再创建出该类对象,最后挂接在多选按钮上就完成了:
BoxOnClickListener listener = new BoxOnClickListener(); eatBox.setOnClickListener(listener); sleepBox.setOnClickListener(listener); codBox.setOnClickListener(listener); allBox.setOnClickListener(listener);
做法2: 继承的接口改为OnCheckedChangeListener。以及方法改为onCheckedChanged(CompoundButton boxButton, boolean isChecked)
class BoxOnCheckedChangeListener implements OnCheckedChangeListener { @Override public void onCheckedChanged(CompoundButton boxButton, boolean isChecked) { }}
原来的通过box.isCheckde来判断选中与否,现在就可以用isChecked来代替:
case R.id.eatBox: if(isChecked){ System.out.println("eatBox is checked"); } else { System.out.println("eatBox is unchecked"); } break;
最后创建见监听器类对象,并挂接上就完成了:
BoxOnCheckedChangeListener listener = new BoxOnCheckedChangeListener(); eatBox.setOnCheckedChangeListener(listener); sleepBox.setOnCheckedChangeListener(listener); codBox.setOnCheckedChangeListener(listener); allBox.setOnCheckedChangeListener(listener);
##4· 课后练习 ###4.1· 实现全选 通过CheckBox的setChecked(Boolean)方法来实现:
case R.id.allBox: eatBox.setChecked(isChecked); sleepBox.setChecked(isChecked); codBox.setChecked(isChecked); break;
###4.2· 练习要注意的地方
- 当每个选项都被选中时,全选按钮也应自动被选中:
if(eatBox.isChecked() && sleepBox.isChecked() && codBox.isChecked()) { allBox.setChecked(true); } else {...}
- 当每个选项都被选中时(包括全选按钮),取消除全选按外的任意一个选项时,全选按钮也应自动取消:
else {//因为在取消全选按钮的时候,会把每个选项都取消掉,所以要用一个临时变量来保持取消前的状态。 boolean eatTemp = eatBox.isChecked(); boolean sleepTemp = sleepBox.isChecked(); boolean codTemp = codBox.isChecked(); allBox.setChecked(false); eatBox.setChecked(eatTemp); sleepBox.setChecked(sleepTemp); codBox.setChecked(codTemp); }
完毕