Android UI 组件系列(五):CheckBox、RadioButton 与 Switch 控件详解

博客专栏:Android初级入门UI组件与布局

源码:通过网盘分享的文件:Android入门布局及UI相关案例

链接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd=4k9n 提取码: 4k9n

引言

在 Android 开发中,用户与应用的交互往往离不开各种“选择”操作,例如:

  • 注册表单中选择兴趣爱好(可多选)
  • 设置界面中切换通知、Wi-Fi 开关(开/关状态)
  • 性别、支付方式等只能选一个的情况(单选)

为了应对这些常见场景,Android 提供了三类核心选择控件:

  • CheckBox —— 多选按钮,允许用户选择多个选项
  • RadioButton / RadioGroup —— 单选按钮组,只能选一个
  • Switch / ToggleButton —— 用于开关设置,表现形式更直观

本篇将继续《Android UI 组件系列》,系统讲解这几类选择控件的使用方法、选中状态的监听方式,以及它们在实际项目中的常见用法和注意事项。

无论你正在开发用户注册页,还是设置中心界面,这些控件都将是你的“得力工具”。

一、CheckBox:多选按钮

checkBox 是 Android 中最常见的多选控件,允许用户从一组选项中选择任意多个。它继承自 CompoundButton,拥有 isChecked 属性,并支持监听选中状态变化。

典型的使用场景包括:选择兴趣爱好、可选服务、偏好设置等。

1.1 布局示例

以下是一个简单的多选界面,用户可以选择自己喜欢的编程语言:

<!-- res/layout/activity_main.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <CheckBox
        android:id="@+id/checkbox_java"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Java" />

    <CheckBox
        android:id="@+id/checkbox_kotlin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kotlin" />

    <CheckBox
        android:id="@+id/checkbox_python"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Python" />

    <Button
        android:id="@+id/btn_submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提交选择"
        android:layout_marginTop="24dp"/>
</LinearLayout>

1.2 Kotlin 中处理选中状态

接下来我们在 MainActivity.kt 中处理用户点击“提交选择”后的逻辑:

    /**
     * 处理checkbox的选择和提交
     * 在这个方法中,我们获取了三个复选框和一个提交按钮。
     * 当用户点击提交按钮时,我们检查每个复选框是否被选中,
     * 如果被选中,就将对应的语言添加到一个列表中,并显示一个Toast消息。
     */
    private fun handleCheckbox() {
        val javaCheckBox = findViewById<CheckBox>(R.id.checkbox_java)
        val kotlinCheckBox = findViewById<CheckBox>(R.id.checkbox_kotlin)
        val pythonCheckBox = findViewById<CheckBox>(R.id.checkbox_python)
        val submitButton = findViewById<Button>(R.id.btn_submit)

        submitButton.setOnClickListener {
            val selectedLanguages = mutableListOf<String>()

            if (javaCheckBox.isChecked) selectedLanguages.add("Java")
            if (kotlinCheckBox.isChecked) selectedLanguages.add("Kotlin")
            if (pythonCheckBox.isChecked) selectedLanguages.add("Python")

            Toast.makeText(
                this,
                "你选择了:${selectedLanguages.joinToString()}",
                Toast.LENGTH_SHORT
            ).show()
        }

    }

1.3 监听选中状态变化(可选)

如果你希望实时监听每个 CheckBox 的选中与否(比如用于即时展示或保存状态),可以使用如下方式:

javaCheckBox.setOnCheckedChangeListener { _, isChecked ->
    Log.d("CheckBox", "Java 选中状态: $isChecked")
}
  • CheckBox 是实现多选的首选控件,适用于兴趣、偏好等非互斥选项。
  • 通过 isChecked 属性可以获取选中状态。
  • 可通过 setOnCheckedChangeListener 实时监听变化,或在点击按钮时统一读取状态。

二、RadioButton 与 RadioGroup:单选按钮组

当用户需要从多个选项中只能选择一个时,RadioButton 是首选控件。为了自动管理多个按钮的选中状态,通常需要配合 RadioGroup 使用。

2.1 布局示例

以下是一个用于选择性别的单选按钮组示例:

<!-- res/layout/activity_main.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <RadioGroup
        android:id="@+id/radio_group_gender"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radio_male"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="男" />

        <RadioButton
            android:id="@+id/radio_female"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="女" />
    </RadioGroup>

    <Button
        android:id="@+id/btn_confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确认选择"
        android:layout_marginTop="24dp" />
</LinearLayout>

2.2 Kotlin 中获取选中项

在点击“确认选择”时,我们可以获取当前被选中的 RadioButton:

    /**
     * 处理单选按钮的选择
     * 在这个方法中,我们可以添加逻辑来处理单选按钮的选择。
     * 例如,我们可以获取单选按钮的状态,并在用户选择后显示一个Toast消息。
     */
    private fun handleRadioButton() {
        val radioGroup = findViewById<RadioGroup>(R.id.radio_group_gender)
        val btnConfirm = findViewById<Button>(R.id.btn_confirm)

        btnConfirm.setOnClickListener {
            val checkedId = radioGroup.checkedRadioButtonId
            val gender = when (checkedId) {
                R.id.radio_male -> "男"
                R.id.radio_female -> "女"
                else -> "未选择"
            }

            Toast.makeText(this, "你选择了:$gender", Toast.LENGTH_SHORT).show()
        }
    }

2.3 实时监听选中变化(可选)

如果你想在用户切换选项时立即响应,而不是等点击按钮,可以设置监听器:

radioGroup.setOnCheckedChangeListener { group, checkedId ->
    val gender = when (checkedId) {
        R.id.radio_male -> "男"
        R.id.radio_female -> "女"
        else -> "未知"
    }
    Log.d("RadioGroup", "当前选中性别:$gender")
}

  • RadioButton 实现单选功能,但必须配合 RadioGroup 才能自动互斥。
  • 通过 checkedRadioButtonId 获取当前选中项。
  • 支持默认选中、动态切换、监听变化等功能,适用于表单填写、偏好选择等场景。

三、Switch 与 ToggleButton:开关控件

在 Android 的设置界面中,我们经常会看到用于开关某项功能的控件,比如开启通知、启用 Wi-Fi、是否使用暗色模式等。实现这类功能的推荐方式是使用 Switch 或 ToggleButton。

这两个控件本质上都是继承自 CompoundButton,具备布尔型开关状态,并支持监听变化。

控件

说明

推荐使用场景

Switch

类似 iOS 的滑动开关,现代化视觉

系统设置、偏好项开关

ToggleButton

两态按钮,样式旧、可自定义文字

表达“启用/禁用”的功能项

3.1 布局示例

我们用 Switch 控件表示“是否开启通知”,并用 ToggleButton 表示“是否启用黑暗模式”:


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <Switch
        android:id="@+id/switch_notify"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开启通知" />

    <ToggleButton
        android:id="@+id/toggle_dark_mode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOn="深色模式开启"
        android:textOff="深色模式关闭"
        android:layout_marginTop="16dp" />
</LinearLayout>

3.2 Kotlin 中监听状态变化

   /**
     * 处理开关和切换按钮
     * 在这个方法中,我们可以添加逻辑来处理开关和切换按钮的状态。
     * 例如,我们可以在用户切换开关时显示一个Toast消息。
     */
    private fun handleSwitch() {
        val switchNotify = findViewById<Switch>(R.id.switch_notify)
        val toggleDarkMode = findViewById<ToggleButton>(R.id.toggle_dark_mode)

        switchNotify.setOnCheckedChangeListener { _, isChecked ->
            val status = if (isChecked) "已开启通知" else "已关闭通知"
            Toast.makeText(this, status, Toast.LENGTH_SHORT).show()
        }

        toggleDarkMode.setOnCheckedChangeListener { _, isChecked ->
            val status = if (isChecked) "深色模式已启用" else "深色模式已关闭"
            Toast.makeText(this, status, Toast.LENGTH_SHORT).show()
        }
    }

3.3 样式提示

Switch 支持 thumbTint 和 trackTint 属性,分别修改滑块颜色和轨道颜色。

ToggleButton 可以通过 textOn / textOff 设置切换时的文字,也可以自定义背景。

3.4 使用建议

控件类型

推荐场合

不推荐用法

Switch

设置项、偏好项、状态切换

表达“操作”类逻辑,比如“提交”

ToggleButton

样式个性化场景,可替代按钮

视觉风格过时,非 Material 风格推荐避免使用

  • Switch 和 ToggleButton 都是二选一的“开/关”控件,用于设置项是非常合适的。
  • 建议优先使用 Switch,样式现代、用户认知一致。
  • 可以通过 isChecked 获取状态,通过监听器响应状态切换。

结语

在 Android UI 开发中,针对“用户选择”的不同需求,我们可以灵活使用不同的控件来实现:

控件类型

选择方式

典型用途

是否推荐

CheckBox

多选

兴趣偏好、复选列表

✅ 推荐

RadioButton + RadioGroup

单选

性别、支付方式等

✅ 推荐

Switch

开关

设置项开/关

✅ 强烈推荐

ToggleButton

开关

自定义样式场景

⚠️ 有替代品,谨慎使用

这几类控件都继承自 CompoundButton,用法相似:通过 isChecked 获取状态,通过 setOnCheckedChangeListener监听用户交互,非常适合快速搭建交互界面。

随着 Jetpack Compose 的兴起,构建 UI 的方式正在逐步从 XML 向 Kotlin 函数组合转变。但对于大多数仍采用传统 View 系统的项目来说,掌握这些基本控件的使用依旧是 Android 开发的重要基础。

博客专栏:Android初级入门UI组件与布局

博客Demo:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值