按钮类组件(单选按钮RadioButton和复选框CheckBox)
- 单选按钮RadioButton
-
单选按钮:通常显示为一个圆形的图标,并且在图标旁放置了一些说明性的文字。多数情况下单选按钮都是成组出现的,在一组单选按钮中同一时间只有一个能被选中。
在activity_main.xml文件中,使用RadioButton标签来定义单选按钮。
-
属性:
- android:text :为单选按钮添加说明文字。
- android:checked :设置单选按钮默认选中。取值为true则默认选中;反之为默认不选中。默认取值为false。
- android:text :为单选按钮添加说明文字。
-
用RadioGroup标签来设置单选按钮组:
如果不用RadioGroup包裹这三个RadioButton,就不是一个单选按钮组。因为每个按钮都可以同时被选中。 -
获取单选按钮组中选中单选按钮的值:
- 方法一:在选中状态改变时获取(本来选择的男,现在选择女,在这时获取女)
为单选按钮组设置id属性,以便在Java文件中获取这个单选按钮组:
在MainActivity.java文件中编写如下代码:
运行结果:
- 方法二:在点击其他按钮(如提交按钮)时获取
先添加一个单击提交按钮,id为tj:
在MainActivity.java文件中添加如下代码:
- 方法一:在选中状态改变时获取(本来选择的男,现在选择女,在这时获取女)
package com.example.radiobuttondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在状态改变时获取:
//通过id获取单选按钮组
rg=findViewById(R.id.radiogroup);
//添加选中状态改变的监听器,方法参数为一个匿名内部类
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//自动重写此方法,此方法有两个参数,第一个是当前单选按钮组;第二个是当前选中项的id
//获取当前选中项的单选按钮
RadioButton r=findViewById(checkedId);
//添加一个消息提示框来显示获取到的信息
Toast.makeText(MainActivity.this,"性别:"+r.getText(),Toast.LENGTH_LONG).show();
}
});
//在点击提交按钮时获取:
//通过id获取提交按钮
Button tj=findViewById(R.id.tj);
//为提交按钮添加单击事件监听器
tj.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过一个for循环语句遍历单选按钮组,找到被选中的那个单选按钮
//getChildCount()为获取当前组件的子组件的数量
for(int i=0;i<rg.getChildCount();i++){
//获取当前的单选按钮
RadioButton r=(RadioButton) rg.getChildAt(i);
//判断获取到的单选按钮是否被选中
if (r.isChecked()){
//选中则显示内容
Toast.makeText(MainActivity.this,r.getText(),Toast.LENGTH_LONG).show();
//单选按钮组只有一个按钮可以被选中,如果执行到这一步,证明后面的按钮都没有被选中
//就可以不用再遍历判断,这样可以提高代码效率。
break;
}
}
}
});
}
}
注意:
运行结果:
因为上面的代码中两种方法的代码都有,所以运行结果会展示两种:
更改状态(点击保密单选按钮)时显示:
点击提交按钮时显示:
- 复选框CheckBox
-
复选框:通常情况下显示为一个方块的图标,并且在图标旁有一些说明性的文字。与单选按钮不同的是:复选框支持多选设置,每个按钮都提供了选中状态和不选中状态。
在activity_main.xml文件中,用CheckBox标签来定义复选框:
-
属性:
- android:text :在方框图标旁添加说明性文字。
- android:checked :设置当前复选框默认选中。取值true默认选中。
-
添加多个复选框:
不需要像RadioButton那样用RadioGroup包裹,只需要直接添加多个复选框组件即可:
-
获取多个复选框中选中复选框的值:
为每个复选框组件定义一个id,同时定义一个提交按钮组件:
然后在Java文件中编写以下代码:
package com.example.checkboxdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TableRow;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//定义提交按钮、复选框及保存复选框的List
private Button button;
private CheckBox checkBox1,checkBox2,checkBox3;
private List<CheckBox> checkBoxList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件:
button=findViewById(R.id.tj);
checkBox1=findViewById(R.id.like1);
checkBox2=findViewById(R.id.like2);
checkBox3=findViewById(R.id.like3);
//将复选框组件添加到list中
checkBoxList.add(checkBox1);
checkBoxList.add(checkBox2);
checkBoxList.add(checkBox3);
//为提交按钮设置单击按钮监控器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//因为是多选,结果就可能是多个选项拼接,涉及到字符串拼接。
//所以创建一个StringBuffer型字符串变量sb。
StringBuffer sb=new StringBuffer();
//遍历复选框List,判断每个复选框的状态
for (CheckBox checkBox : checkBoxList) {
if(checkBox.isChecked()){
//如果当前复选框被选中,就将其结果拼接在sb上
sb.append(checkBox.getText().toString()+" ");
}
}
//判断字符串sb不为空,首先判断sb对象是否为null,不为null才判断其内容是否为空
if(sb!=null &&"".equals(sb.toString())){
Toast.makeText(MainActivity.this,"请至少选择一个爱好",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"您的爱好是:"+sb,Toast.LENGTH_LONG).show();
}
}
});
}
}
运行结果:
注意:
- 为什么用StringBuffer而不用String?
字符串拼接时,String直接创建一个新的对象,其内容为原对象的内容和需要拼接的内容拼在一起;StringBuffer是将需要拼接的内容拼接到当前对象的内容后。主要是因为String底层用final修饰,相当于常量,常量不可更改。 - ==和equals:
==在判断对象时用于判断左右两边是否为同一个对象;equals判断对象的值是否相等。具体请看Java中equals和==的区别。