Android 项目中自定义多个 RadioButton 并排一列选择效果实现
文章目录
- 1、静态版实现
- 1.1、实现要求
- 1.2、实现步骤
- 1.3、代码实现
- 1.4、代码实现说明
- 1.5、结论
- 2、项目版实现(动态)
- 1、先看效果图
- 2、main的布局文件
- 3、定义RadioButton的属性
- 4、最后在代码中生成我想要的东东
- 5、说明
- 3、后续优化方向
1、静态版实现
1.1、实现要求
我们需要在Android中创建多个RadioButton并排成一行,且能够左右滑动。我们将使用HorizontalScrollView来实现左右滑动的功能,并在其内部放置一个RadioGroup来排列RadioButton。
1.2、实现步骤
1、创建布局文件:在res/layout文件夹下创建一个XML布局文件。
2、在布局文件中使用HorizontalScrollView和RadioGroup:在HorizontalScrollView中包含一个RadioGroup,并在其中添加多个RadioButton。
3、在Activity中加载布局:设置Activity的布局文件,并在代码中处理RadioButton的逻辑(如果需要)。
4、运行效果:展示代码的运行结果。
1.3、代码实现
1、 布局文件(XML)
在res/layout文件夹中创建一个名为activity_main.xml的布局文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<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"><HorizontalScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:scrollbars="none"><RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/radioButton1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Option 1" /><RadioButtonandroid:id="@+id/radioButton2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Option 2" /><RadioButtonandroid:id="@+id/radioButton3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Option 3" /><RadioButtonandroid:id="@+id/radioButton4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Option 4" /><RadioButtonandroid:id="@+id/radioButton5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Option 5" /><!-- 可以继续添加更多的 RadioButton --></RadioGroup></HorizontalScrollView></LinearLayout>
2、Activity文件(Java)
在MainActivity中加载布局文件。
package com.example.radiobuttonexample;import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 在这里可以处理 RadioButton 的逻辑,例如设置监听器}
}
3、 运行效果
当运行上述代码时,您将会看到多个RadioButton并排一行排列在屏幕上,并且可以左右滑动查看更多的选项。
1.4、代码实现说明
1、HorizontalScrollView:这是一个水平滚动的视图容器,允许其包含的视图在水平方向上滑动。我们使用它来实现RadioButton的左右滑动功能。
2、RadioGroup:这是一个用于包含RadioButton的容器,我们将其方向设置为水平(android:orientation=“horizontal”),使其内的RadioButton并排显示。
3、RadioButton:这些是单选按钮,每个按钮表示一个选项。
1.5、结论
通过使用HorizontalScrollView和RadioGroup,我们能够在Android中创建一个能够左右滑动的并排RadioButton组。这个实现方法适用于需要在一个屏幕上显示多个选项但空间有限的情况。这样不仅保持了布局的整洁,还提高了用户体验。
2、项目版实现(动态)
如果希望RadioButton的数量和内容能够动态配置,可以通过网络请求或本地数据库读取数据,并根据数据动态生成RadioButton。
1、先看效果图
可以左右滑动
2、main的布局文件
3、定义RadioButton的属性
3.1、布局文件引用了android:background=“@drawable/radiostyles”
3.2、布局文件引用了android:textColor=“@color/colorselector”
4、最后在代码中生成我想要的东东
根据项目实际情况,按钮的个数通过函数参数传递进来,
代码动态生成按钮个数
5、说明
5.1、布局中通常会用到@null。如RadioButton常用的技巧通过RadioGroup实现Tab,需要设置android:button=“@null”。如果要在代码中动态创建控件,android中并不能找到相关的属性或方法。搜索均无解决办法,最后想到一个变通的方法:通过透明色获取drawable。
//java代码
setButtonDrawable(getResources().getDrawable(android.R.color.transparent));
5.2、实际还是可以通过布局的方法来动态创建控件。先创建一个RadioButton的radiobutton.xml,再用代码生成RadioButton,本示例就是用的这种方法:
//java代码
RadioButton radioButton = (RadioButton) LayoutInflater.from( getBaseContext( ) ).inflate(R.layout.radiobutton, null );
这种方式的好处是样式等属性可以在布局中统一指定省的查sdk寻找相关属性的设置方法,要不然在布局中有些属性是没有对应的设置函数,或许是很难找到对应的函数。
在以后还可以把这个例子的功能上完善,比如说实现反弹的效果,这样就更完美了,值得期待。
3、后续优化方向
3.1、使用 RecyclerView
如果我们的选项数量非常大,或者需要支持动态加载和回收复用视图的情况,建议使用 RecyclerView 来替代 RadioGroup。这样可以提高性能并支持大量选项的展示。
3.2、使用 RecyclerView 的示例:
*创建一个 RecyclerView 的布局文件,例如 item_radio_button.xml,用于定义单个 RadioButton 的布局。
*创建一个 RecyclerView 的适配器,在适配器中设置 RadioButton 的数据和点击事件。
*在 MainActivity 中使用 RecyclerView,并设置其布局管理器和适配器。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |
相关文章:

Android 项目中自定义多个 RadioButton 并排一列选择效果实现
文章目录 1、静态版实现1.1、实现要求1.2、实现步骤1.3、代码实现1.4、代码实现说明1.5、结论 2、项目版实现(动态)1、先看效果图2、main的布局文件3、定义RadioButton的属性4、最后在代码中生成我想要的东东5、说明 3、后续优化方向 1、静态版实现 1.1、实现要求 我们需要在…...

解决win系统msvcp140.dll丢失的多种常用方法,亲测有效!
msvcp140.dll 是一个重要的Windows系统文件,属于Microsoft Visual C Redistributable runtime components的一部分,特别与Visual Studio 2015及之后版本编译的C应用程序相关联。这个动态链接库(DLL)文件包含了一系列C标准库的功能…...
使用keepalived实现mysql主从复制的自动切换
使用Keepalived实现MySQL主从复制的自动切换通常涉及配置一个虚拟IP(VIP)作为MySQL服务器对客户端的访问点。Keepalived会监控MySQL主服务器的健康状况,如果主服务器宕机,Keepalived会自动将虚拟IP移至备用服务器,从而…...

数据库(4)——DDL数据库操作
SQL标准没有提供修改数据库模式定义的语句,用户想修改次对象只能将它删除后重建。 查询 查询所有数据库: SHOW DATABASES; 在安装完MySQL数据库之后,自带了4个数据库,如下图: 创建数据库 数据库的创建语言为 CREATE…...

C#基础一
使用Visual Studio 2022(VS2022)编写C#控制台程序 1. 安装Visual Studio 2022 确保已安装Visual Studio 2022。如果未安装,请从Visual Studio官网下载并安装。 另一篇文章中已经有详细描述,这里就不在细说了。 VisualStudio2022…...

UOS1060e分离ssh与sftp服务
文章目录 原理一、sftp 用户与目录二、ssh 和 sftp 服务分离三、启动与停止四、验证 原理 SFTP是SSH的一部分,SFTP没有单独的守护进程,它必须使用SSHD守护进程(端口号默认是22)来完成相应的连接操作。 通过新建另一个‘sshd’进程…...

LeetCode刷题之HOT100之多数元素
2024/5/21 起床走到阳台,外面绵柔细雨,手探出去,似乎感受不到。刚到实验室,窗外声音放大,雨大了。昨天的两题任务中断了,由于下雨加晚上有课。这样似乎也好,不让我有一种被强迫的感觉࿰…...
回溯算法06(总结+leetcode332,51,37)
参考资料: https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html 力扣这三题暂时不在本篇笔记中贴代码了,有兴趣的可参考332.重新安排形成、N皇后、解数独 总结: 画树形图分析题目 用途:回溯算法是用 递归实现…...
LabVIEW图像识别的技术手段有什么?
LabVIEW在图像识别领域采用了多种技术手段,以实现对图像的采集、处理、分析和识别。以下是一些主要的技术手段: 1. 图像采集 工业相机:使用高分辨率相机捕捉图像,确保图像质量和细节。接口支持:支持多种相机接口&…...

Vulhub——adminer
文章目录 一、CVE-2021-21311(SSRF)二、CVE-2021-43008(远程文件读取) 一、CVE-2021-21311(SSRF) Adminer是一个PHP编写的开源数据库管理工具,支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL…...
MySQL之性能剖析(三)
剖析MySQL查询 剖析单条查询 在定位到需要优化的单条查询后,可以针对查询"钻取"更多的信息,确认为什么会花费这么长的时间执行,以及需要如何去优化。不幸的是,MySQL目前大多数的测量点对于剖析查询都没有什么帮助。当…...
spark 之数据湖
delta lake 基本使用 可参见: https://docs.delta.io/2.3.0/quick-start.html#language-scala bin/spark-shell --packages io.delta:delta-core_2.12:2.3.0 --conf "spark.sql.extensionsio.delta.sql.DeltaSparkSessionExtension" --conf "spark…...
记录Hbase出现HMaster一直初始化,日志打印hbase:meta,,1.1588230740 is NOT online问题的解决
具体错误 hbase:meta,,1.1588230740 is NOT online; state{1588230740 stateOPEN, ...... 使用 hbase 2.5.5 ,hdfs和hbase分离两台服务器。 总过程 1. 问题发现 在使用HBase的程序发出无法进行插入到HBase操作日志后检查HBase状况。发现master节点和r…...

Linux——进程信号(二)
引言 在进程信号(一)中我们已经讲到了信号的保存,那么接下来要讲信号的处理了。 信号的处理主要要回答3个问题: 1.信号什么时候被处理的? 2.信号如何被处理的? 3.捕捉信号还有其他方式吗? 首先回答问题一࿱…...

2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(下):多智能体开发
传送门: 《2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(上):MetaGPT安装、单智能体开发》《2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(中)&…...

SQL开窗函数
文章目录 概念:语法:常用的窗口函数及示例:求平均值:AVG() :求和:SUM():求排名:移动平均计数COUNT():求最大MXA()/小MIN()值求分区内的最大/最小值求当前行的前/后一个值 概念: 开窗…...

[xx点评完结]——白马点评完整代码+rabbitmq实现异步下单+资料,免费
项目所有功能已测,均可以跑通,Jmeter和RabbitMQ也都测了。 项目源码:dianpinghui: 仿黑马点评项目 资料: https://pan.baidu.com/s/1kTCn9PxgeIey90WgM4KRqA?pwdn66b 对佬有帮助可以给个star哈,感谢🌹🌹dz…...

Hadoop+Spark大数据技术 实验8 Spark SQL结构化
9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…...
认知V2X的技术列一个学习大纲
为了深入学习和理解V2X(Vehicle to Everything)技术,以下是一个学习大纲的概述,结合了参考文章中的相关数字和信息: 一、V2X技术基础 V2X概述 定义:V2X是车用无线通信技术,将车辆与一切事物相连…...

揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器
在机械制造领域,齿轮作为传动系统中的重要组成部分,其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构,深入探讨齿轮加工工艺的选用原则,带您了解如何精准打造高效传动的秘密武…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...

break 语句和 continue 语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...