Android RadioGroup实现多行显示,并保持单选

公司项目最近有个这样的需求,要求实现【多个文本,多行显示,且同时只能选中一个】。设计图效果如下:

看上去很简单,使用 RadioGroup + LinearLayout + RadioButton 快速实现:

<RadioGroupandroid:id="@+id/rg"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="@dimen/SIZE_18"android:layout_marginTop="@dimen/SIZE_9"android:layout_marginRight="@dimen/SIZE_18"android:layout_marginBottom="@dimen/SIZE_20"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/RadioButton1"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_abnormal_function"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12"></RadioButton><RadioButtonandroid:id="@+id/RadioButton2"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginLeft="@dimen/SIZE_10"android:autoSizeMaxTextSize="18sp"android:autoSizeMinTextSize="6sp"android:autoSizeStepGranularity="1sp"android:autoSizeTextType="uniform"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_experience_problem"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12"></RadioButton><RadioButtonandroid:id="@+id/RadioButton3"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginLeft="@dimen/SIZE_10"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_new_feature_suggestion"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12"></RadioButton></LinearLayout><RadioButtonandroid:id="@+id/RadioButton4"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginTop="@dimen/SIZE_9"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_type_other"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12"></RadioButton>
</RadioGroup>

跑起来后,发现并没有实现单选的效果,究其根本,观其RadioGroup源码:

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {if (child instanceof RadioButton) {final RadioButton button = (RadioButton) child;if (button.isChecked()) {mProtectFromCheckedChange = true;if (mCheckedId != -1) {setCheckedStateForView(mCheckedId, false);}mProtectFromCheckedChange = false;setCheckedId(button.getId());}}super.addView(child, index, params);
}

RadioGroup在添加子view时,仅判断了其是否是RadioButton,故LinearLayout并不符合这一条件,要想实现内嵌LinearLayout+RadioButton,只能自定义RadioGroup,并重写addView方法。本文使用了另一方式解决这个问题:

使用多个RadioGroup内嵌RadioButton,当其中1个RadioGroup中的RadioButton被选中时,清除其他RadioGroup的选中效果,代码如下:

<RadioGroupandroid:id="@+id/rg"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="@dimen/SIZE_18"android:layout_marginTop="@dimen/SIZE_9"android:layout_marginRight="@dimen/SIZE_18"android:orientation="horizontal"><RadioButtonandroid:id="@+id/RadioButton1"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_abnormal_function"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12" /><RadioButtonandroid:id="@+id/RadioButton2"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginLeft="@dimen/SIZE_10"android:autoSizeMaxTextSize="18sp"android:autoSizeMinTextSize="6sp"android:autoSizeStepGranularity="1sp"android:autoSizeTextType="uniform"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_experience_problem"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12" /><RadioButtonandroid:id="@+id/RadioButton3"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginLeft="@dimen/SIZE_10"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_new_feature_suggestion"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12" /></RadioGroup><RadioGroupandroid:id="@+id/rgTow"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="@dimen/SIZE_18"android:layout_marginRight="@dimen/SIZE_18"android:layout_marginBottom="@dimen/SIZE_20"><RadioButtonandroid:id="@+id/RadioButton4"style="@style/fontStyle"android:layout_width="wrap_content"android:layout_height="28dp"android:layout_marginTop="@dimen/SIZE_9"android:background="@drawable/bg_button_bg"android:button="@null"android:paddingLeft="@dimen/SIZE_10"android:paddingRight="@dimen/SIZE_10"android:text="@string/str_type_other"android:textColor="@drawable/text_color_select"android:textSize="@dimen/SP_SIZE_12" />
</RadioGroup>

实现逻辑:

private fun init(){mViewBind.rg.setOnCheckedChangeListener(OneCheckedChange())mViewBind.rgTow.setOnCheckedChangeListener(TowCheckedChange())
}inner class OneCheckedChange : OnCheckedChangeListener {override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {// 清除另一RadioGroup选中状态mViewBind.rgTow.setOnCheckedChangeListener(null)mViewBind.rgTow.clearCheck()mViewBind.rgTow.setOnCheckedChangeListener(TowCheckedChange())// 根据 ID 判断选择的按钮mtype = when (checkedId) {R.id.RadioButton1 -> 1R.id.RadioButton2 -> 2R.id.RadioButton3 -> 3else -> 0}}}inner class TowCheckedChange : OnCheckedChangeListener{override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {mViewBind.rg.setOnCheckedChangeListener(null)mViewBind.rg.clearCheck()mViewBind.rg.setOnCheckedChangeListener(OneCheckedChange())// 根据 ID 判断选择的按钮if(checkedId == R.id.RadioButton4){mtype =4}}}

至此实现【多个文本,多行显示,且同时只能选中一个】效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394176.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++进阶数据结构]二叉搜索树

多态讲完了,我们来讲点轻松的(也许)。 我们之前讲过二叉树&#xff0c;而二叉树中&#xff0c;又有一种特殊的树称之为二叉搜索树。 一、二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空…

中电信翼康济世数据中台基于Apache SeaTunnel构建数据集成平台经验分享

作者 | 中电信翼康工程师 代来 编辑 | Debra Chen 一. 引言 Apache SeaTunnel作为一个高性能、易用的数据集成框架&#xff0c;是快速落地数据集成平台的基石。本文将从数据中台战略背景、数据集成平台技术选型、降低Apache SeaTunnel使用门槛及未来展望几个方面&#xff0c…

【环绕字符串中唯一的子字符串】python刷题记录

R4-字符串 动态规划 class Solution:def findSubstringInWraproundString(self, s: str) -> int:dp[0]*26num1#dp初始化dp[ord(s[0])-ord(a)]1for c1,c2 in pairwise(s):if not (ord(c2)-ord(c1)-1)%26:num1else:num1dp[id]max(dp[id : ord(c2)-ord(a)],num)return sum(dp)p…

调用azure的npm实现outlook_api模拟查看邮件、发送邮件(实现web版接受outlook邮件第一步)

文章目录 ⭐前言⭐注册azure应用&#x1f496;添加权限 ⭐调用npm 实现收发邮件&#x1f496;安装依赖&#x1f496;创建appSettings.js 放置密钥&#x1f496;创建graphHelper.js封装功能&#x1f496;主文件index.js 对外暴露&#x1f496;效果 ⭐结束 ⭐前言 大家好&#x…

Flutter GPU 是什么?为什么它对 Flutter 有跨时代的意义?

Flutter 3.24 版本引入了 Flutter GPU 概念的新底层图形 API flutter_gpu &#xff0c;还有 flutter_scene 的 3D 渲染支持库&#xff0c;它们目前都是预览阶段&#xff0c;只能在 main channel 上体验&#xff0c;并且依赖 Impeller 的实现。 Flutter GPU 是 Flutter 内置的底…

2024最新Mysql锁机制与优化实践以及MVCC底层原理剖析

锁机制详解 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解…

3Done学习笔记

一、基本操作 1、旋转视角 使用左下角立方体选择&#xff1b; 右键可以拖动视角&#xff1b; 中间滑轮按住拖动整个舞台界面。 2、平移和旋转 右键选择移动&#xff0c;有两种方式。 第一种选择起始点&#xff0c;按照起始点位置移动到终止点。第二种直接根据轮盘旋转或…

【docker】docker容器部署常用服务

1、容器部署nginx&#xff0c;并且新增一个页面 docker run -d -p 81:80 --name nginx2 nginx docker exec -it nginx2 /bin/bashcd /usr/share/nginx/html/ echo "hello world">>hello.html2、容器部署redis&#xff0c;成功部署后向redis中添加一条数据 do…

【C/C++笔记】:易错难点3 (二叉树)

选择题 &#x1f308;eg1 一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树&#xff0c;叶子节点的个数最多会差多少个&#xff08;&#xff09;&#xff1f; 正确答案&#xff1a; C A. 3 B. 5 C. 7 D. 9 解析&#xff1a;普通二叉树的叶子节…

WPF学习笔记

WPF WPF&#xff08;Windows Presentation Foundation&#xff0c;Windows呈现基础&#xff09;是微软推出的基于Windows 的用户界面框架&#xff0c;属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架&#xff0c;真正做到了分离界面设计人员与开发人员的…

C语言----计算开机时间

计算开机时间 实例说明 编程实现计算开机时间&#xff0c;要求在每次开始计算开机时间时都能接着上次记录的结果向下记录。 实现过程&#xff1a; 1. 在TC中创建一个C文件。 2. 引用头文件&#xff0c;代码如下: #include <stdio.h> 3. 定义结构体time&#xff0c;用来…

如何在Chrome、Edge、360、Firefox等浏览器查看网站SSL证书信息?

在如今的网络环境中&#xff0c;保障网络安全、数据安全尤其重要&#xff0c;市面上大部分网站都部署了SSL证书以实现HTTPS加密保护数据传输安全以及验证网站身份&#xff0c;确保网站安全可信。那么如何查看网站的SSL证书信息&#xff1f;接下来&#xff0c;我们将详细介绍如何…

【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式

文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…

【Nacos无压力源码领读】(三) Nacos 配置中心与热更新原理详解 敢说全网最细

本文将从 Nacos 配置中心的基本使用入手, 详细介绍 Nacos 客户端发布配置, 拉取配置, 订阅配置的过程以及服务器对应的处理过程; 配置订阅以及热更新原理相关的部分, 我看了主流的博客网站, 绝对没有比这更详细的讲解; 如果在阅读过程中对文中提到的 SpringBoot 启动过程以及…

Milvus与Zilliz Cloud:向量数据库高可用性的双重飞跃

向量数据库高可用性的重要性及其在现代数据分析中的关键作用 在数据爆炸式增长的今天,企业对于高效、准确地处理和分析大规模数据集的需求日益迫切。尤其是在人工智能、机器学习、图像识别、自然语言处理等领域,向量数据库因其对高维数据的高效存储与检索能力,成为了不可或…

Elasticsearch未授权访问漏洞

步骤一:使用以下Fofa语法进行Elasticsearch产品搜索.. fofa语法"Elasticsearch" && port"9200" 步骤二:存在未授权访问则直接进入到信息页面...不需要输入用户密码登陆. http://localhost:9200/_plugin/head/web管理界面 http://localhost:9200/…

【JavaEE】线程池

目录 前言 什么是线程池 线程池的优点 ThreadPollExecutor中的构造方法 corePoolSize && maximumPoolSize keepAliveTime && unit workQueue threadFactory 如何在java中使用线程池 1.创建线程池对象 2.调用submit添加任务 3.调用shutdown关闭线程池…

【Python】requests的response.text 和 urllib.request 的 response.read()的区别

刚写代码的时候&#xff0c;我经常会把requests 和 urllib下的request 包搞混&#xff0c;这两个请求响应的方法看起来很相似&#xff0c;但是写获取的方法是不一样的。 前者requests 是用response.text 来获取源码&#xff0c;而 urllib.request是用 response.read() 来获取h…

数学建模--智能算法之免疫算法

目录 基本原理 应用实例 代码示例 总结 免疫算法在免疫系统研究中的应用和进展是什么&#xff1f; 如何量化评估免疫算法在不同优化问题中的性能和效率&#xff1f; 免疫算法与其他智能优化算法&#xff08;如遗传算法、粒子群优化&#xff09;相比有哪些独特优势和局限性…

【C++】C++11的新特性 — 线程库 ,原子操作 , 条件变量

勇敢就是接受发生在你身上的事&#xff0c;并把它尽力做到最好。 -- 约翰・欧文 -- C11的新特性 1 线程1.1 线程概念1.2 C中的线程1.3 线程并行1.4 锁 2 原子操作3 条件变量Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下…