当前位置: 首页 > news >正文

Android原生实现分段选择

        六年前写的一个控件,一直没有时间总结,趁年底不怎么忙,整理一下之前写过的组件。供大家一起参考学习。废话不多说,先上图。

一、效果图

实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的background样式实现,radioGroup嵌套radiobutton已经实现单选互斥,故直接监听其选中监听处理数据就好。

dp_0.5:就是0.5dp的意思,自行替换成自己的值。

dp_15:代表15dp

二、布局代码

   采用的是RadioGroup嵌套RadioButton的方式。

  <!-- 日期标题 --><RadioGroupandroid:id="@+id/rg_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="@dimen/dp_24"android:layout_marginTop="@dimen/dp_15"android:orientation="horizontal"android:padding="1dp"><RadioButtonandroid:id="@+id/rb_date_day"android:layout_width="@dimen/dp_34"android:layout_height="@dimen/dp_17"android:background="@drawable/day_checked"android:button="@null"android:checked="true"android:gravity="center"android:text="今日"android:textColor="@color/white"android:textSize="@dimen/sp_10" /><RadioButtonandroid:id="@+id/rb_date_week"android:layout_width="@dimen/dp_34"android:layout_height="@dimen/dp_17"android:button="@null"android:background="@drawable/week_checked"android:text="本周"android:gravity="center"android:textColor="@color/white"android:textSize="@dimen/sp_10" /><RadioButtonandroid:id="@+id/rb_date_month"android:layout_width="@dimen/dp_34"android:layout_height="@dimen/dp_17"android:gravity="center"android:background="@drawable/month_checked"android:button="@null"android:text="本月"android:textColor="@color/white"android:textSize="@dimen/sp_10" /></RadioGroup>

三、样式代码

    a.day_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/day_chart_seleced" android:state_checked="true"></item><item android:drawable="@drawable/day_chart_unseleced"></item>
</selector>

   a.1 day_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff2775de" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><cornersandroid:bottomLeftRadius="5dp"android:bottomRightRadius="0dp"android:topLeftRadius="5dp"android:topRightRadius="0dp" />
</shape>

   a.2  day_chart_unseleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#06103A" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><cornersandroid:bottomLeftRadius="5dp"android:bottomRightRadius="0dp"android:topLeftRadius="5dp"android:topRightRadius="0dp" />
</shape>

b.week_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/week_chart_seleced" android:state_checked="true"></item><item android:drawable="@drawable/week_chart_unseleced"></item>
</selector>

b.2 week_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff2775de" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><corners android:radius="@dimen/dp_0" />
</shape>

b.3 week_chart_unseleced样式

         这个样式要特别做下说说明,因为“本周”那个控件位于组件的中部,所以边框样式会出现跟左右两边叠加的现象,从而造成边框过粗的视觉。为了解决这个问题,我采用的是layer-list层级布局,通过颜色覆盖的方式,影藏掉 “本周”那个控件的左右边框,来解决这一问题。下面是实现代码。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item><shape><solid android:color="#06103A" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><corners android:radius="@dimen/dp_0" /></shape></item><itemandroid:bottom="@dimen/dp_0.5"android:top="@dimen/dp_0.5"><shape><strokeandroid:width="@dimen/dp_0.5"android:color="#06103A" /></shape></item>
</layer-list>

c. month_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/month_chart_seleced" android:state_checked="true"></item><item android:drawable="@drawable/month_chart_unseleced"></item>
</selector>

  c.1 month_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff2775de" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><cornersandroid:bottomLeftRadius="0dp"android:bottomRightRadius="5dp"android:topLeftRadius="0dp"android:topRightRadius="5dp" />
</shape>

  c.2 month_chart_unseleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#06103A" /><strokeandroid:width="@dimen/dp_0.5"android:color="#2775DE" /><cornersandroid:bottomLeftRadius="0dp"android:bottomRightRadius="5dp"android:topLeftRadius="0dp"android:topRightRadius="5dp" />
</shape>

四、java代码

 由于使用了databinding双向绑定,故就不演示findviewbyid,如果没有使用databinding,自行去实现就好,只需在onCreate()中调用就好。想了下还是加上findviewbyid方式,就怕遇到啥都不懂的新手抱怨。

方法一 //findviewbyid调用方式:findviewbyid(R.id.rg_gender).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int id) {switch (id) {case R.id.rb_date_day:Log.d("RadioGroup", "===天===");break;case R.id.rb_date_week:Log.d("RadioGroup", "===周===");break;case R.id.rb_date_month:Log.d("RadioGroup", "===月===");break;}}});方法二
//databindig调用方式
//绑定数据mDataBinding.rgDate.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int id) {switch (id) {case R.id.rb_date_day:Log.d("RadioGroup", "===天===");break;case R.id.rb_date_week:Log.d("RadioGroup", "===周===");break;case R.id.rb_date_month:Log.d("RadioGroup", "===月===");break;}}});

给予新手的寄语

     对于新手来讲,开发总会遇到各种各样的问题,逐个解决就好,注意沟通协调。

相关文章:

Android原生实现分段选择

六年前写的一个控件&#xff0c;一直没有时间总结&#xff0c;趁年底不怎么忙&#xff0c;整理一下之前写过的组件。供大家一起参考学习。废话不多说&#xff0c;先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…...

在 Unity 中获取 Object 对象的编辑器对象

有这个需求的原因是&#xff0c;在编辑器的 Inspector 逻辑中&#xff0c;写了许多生成逻辑。 现在不想挨个在 Inspector 上都点一遍按钮&#xff0c;所以就需要能获取到它们的编辑器对象。 发现可以借助官方的 UnityEditor.Editor.CreateEditor 方法达到目的&#xff0c;如下…...

idea自动注释

前言 保存一下自己的自动注释代码 idea自动注释 前言1 创建类时&#xff0c;自动生成注释2 在方法上使用快捷键生成注释3 使用方法4 效果图 1 创建类时&#xff0c;自动生成注释 如下&#xff1a; #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package …...

阿里云 ACK 云上大规模 Kubernetes 集群高可靠性保障实战

作者&#xff1a;贤维 马建波 古九 五花 刘佳旭 引言 2023 年 7 月&#xff0c;阿里云容器服务 ACK 成为首批通过中国信通院“云服务稳定运行能力-容器集群稳定性”评估的产品&#xff0c; 并荣获“先进级”认证。随着 ACK 在生产环境中的采用率越来越高&#xff0c;稳定性保…...

如何在无公网IP环境使用Windows远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…...

Python——yolov8识别车牌2.0

目录 一、前言 二、关于项目UI 2.1、修改界面内容的文本 2.2、修改界面的图标和图片 三、项目修改地方 四、其他配置问题 一、前言 因为后续有许多兄弟说摄像头卡顿&#xff0c;我在之前那个MATS上面改一下就可以了&#xff0c;MAST项目&#xff1a;基于YOLOv8的多端车流检…...

Cookie的详解使用(创建,获取,销毁)

文章目录 Cookie的详解使用&#xff08;创建&#xff0c;获取&#xff0c;销毁&#xff09;1、Cookie是什么2、cookie的常用方法3、cookie的构造和获取代码演示SetCookieServlet.javaGetCookieServlet.javaweb.xml运行结果如下 4、Cookie的销毁DestoryCookieServletweb.xml运行…...

shell脚本自动化部署Zabbix4.2(修改脚本替换版本)

#!/bin/bash # 配置无人值守的安装&#xff0c;定义安装过程中需要用到的一些信息 DBPasswordadmin123 CacheSize256M ZBX_SERVER_NAMEZabbix-Server http_port80 # 配置 Zabbix 防火墙 firewall-cmd --permanent --zonepublic --add-port10051/tcp firewall-cmd…...

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…...

k8s二进制最终部署(网络 负载均衡和master高可用)

k8s中的通信模式 1、pod内部之间容器与容器之间的通信&#xff0c;在同一个pod 中的容器共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直接通信的 2、同一个node节点之内&#xff0c;不同pod之间的通信&#xff0c;每个pod都有一个全局的真实的IP地址&a…...

【51单片机系列】DS1302时钟模块

本文是关于DS1302时钟芯片的相关介绍。 文章目录 一、 DS1302时钟芯片介绍二、DS1302的使用2.1、DS1302的控制寄存器2.2、DS1302的日历/时钟寄存器2.3、片内RAM2.4、DS1302的读写时序 三、SPI总线介绍四、DS1302使用示例 一、 DS1302时钟芯片介绍 DS1302是DALLAS公司推出的涓流…...

深入理解C语言中冒泡排序(优化)

目录 引言&#xff1a; 冒泡排序概述&#xff1a; 优化前&#xff1a; 优化后(注意看注释)&#xff1a; 解析优化后&#xff1a; 原理&#xff08;先去了解qsort&#xff09;&#xff1a; 引言&#xff1a; 排序算法是计算机科学中的基础问题之一。在本篇博客中&#xff0c…...

低代码选型注意事项

凭借着革命性的生产力优势&#xff0c;低代码技术火爆了整个IT圈。面对纷繁复杂的低代码和无代码产品&#xff0c;开发者该如何选择&#xff1f; 在研究低代码平台的年数上&#xff0c;本人已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;很多企业面临低代码选型上的…...

Caffeine--缓存组件

Caffeine 概念缓存手动加载自动加载手动异步加载自动异步加载 驱逐策略基于容量基于时间基于引用 移除显式移除 概念 Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。与ConcurrentMap有点相似。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的…...

Centos7:Jenkins+gitlab+node项目启动(1)

Centos7&#xff1a;Jenkinsgitlabnode项目启动(1) Centos7&#xff1a;Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启动(2) Centos7&#xff1a;Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启…...

starrocks集群fe/be节点进程守护脚本

自建starrocks集群&#xff0c;有时候服务会挂掉&#xff0c;无法自动拉起服务&#xff0c;于是采用supervisor进行进程守护。可能是版本的原因&#xff0c;supervisor程序总是异常&#xff0c;无法对fe//be进行守护。于是写了个简易脚本。 #!/bin/bash AppNameFecom.starrock…...

奇富科技跻身国际AI学术顶级会议ICASSP 2024,AI智能感知能力迈入新纪元

近日&#xff0c;2024年IEEE声学、语音与信号处理国际会议ICASSP 2024&#xff08;2024 IEEE International Conference on Acoustics, Speech, and Signal Processing&#xff09;宣布录用奇富科技关于语音情感计算的最新研究成果论文“MS-SENet: Enhancing Speech Emotion Re…...

如何在Android Termux中使用SFTP实现远程传输文件

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问5. 配置固定远程连接地址6、结语 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFT…...

高频知识汇总 | 【操作系统】面试题汇总(万字长博通俗易懂)

前言 这篇我亲手整理的【操作系统】资料&#xff0c;融入了我个人的理解。当初我在研习八股文时&#xff0c;深感复习时的困扰&#xff0c;网上资料虽多&#xff0c;却过于繁杂&#xff0c;有的甚至冗余。例如&#xff0c;文件管理这部分&#xff0c;在实际面试中很少涉及&…...

【前端框架】NPM概述及使用简介

什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 npm是Node官方提供的包管理工具,他已经成了Node包的标准发布平台,用于Node包的发布、传播、依赖控制。npm提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布…...

AudioLDM-S与LangGraph:构建音效生成工作流引擎

AudioLDM-S与LangGraph&#xff1a;构建音效生成工作流引擎 1. 引言 想象一下这样的场景&#xff1a;电影制作人需要为一场雨夜追逐戏配乐&#xff0c;传统的工作流程需要先搜索音效库&#xff0c;筛选合适的雨声、脚步声、轮胎摩擦声&#xff0c;然后进行剪辑、混音&#xf…...

不止于模拟器:在Windows10上用VS2019+QEMU调试EDK2 UEFI应用的完整流程

从零构建UEFI开发环境&#xff1a;VS2019与QEMU深度整合实战指南 在当今固件开发领域&#xff0c;UEFI已逐步取代传统BIOS成为主流标准。对于开发者而言&#xff0c;搭建一个高效的UEFI开发环境是进行底层系统开发的第一步。本文将带你深入探索如何在Windows10平台上&#xff0…...

暗黑破坏神2存档编辑器完全指南:从技术原理到实战应用

暗黑破坏神2存档编辑器完全指南&#xff1a;从技术原理到实战应用 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 价值定位&#xff1a;为什么d2s-editor能重塑你的游戏体验 你是否曾因反复刷不到心仪装备而失去耐心&#xff1…...

granite-4.0-h-350m效果展示:Ollama运行下德语工业标准文档理解案例

granite-4.0-h-350m效果展示&#xff1a;Ollama运行下德语工业标准文档理解案例 1. 模型核心能力概览 Granite-4.0-H-350M是一个轻量级但功能强大的指令模型&#xff0c;专门针对设备部署和研究场景优化。这个350M参数的模型虽然体积小巧&#xff0c;但在多语言理解和指令跟随…...

RePKG开发者指南:深入理解C逆向工程实现原理

RePKG开发者指南&#xff1a;深入理解C#逆向工程实现原理 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款强大的 Wallpaper Engine PKG文件提取与TEX图像转换工具&#…...

在Jetson Nano上构建海康威视相机Docker镜像:从SDK集成到Python应用部署

1. 环境准备与基础配置 在Jetson Nano上构建海康威视相机Docker镜像的第一步&#xff0c;是确保硬件和基础软件环境就绪。我建议从官方渠道下载最新的JetPack SDK&#xff0c;这个工具包包含了CUDA、cuDNN等深度学习推理必需的组件。安装完成后&#xff0c;记得运行nvidia-smi命…...

FanControl实战指南:从噪音困扰到智能散热的转型之路

FanControl实战指南&#xff1a;从噪音困扰到智能散热的转型之路 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...

避坑指南:RK3588 SD卡刷机时FAT32转EXT4的完整流程(含工具包)

RK3588大容量镜像烧写实战&#xff1a;突破FAT32限制的EXT4全流程解决方案 当你在RK3588开发板上尝试烧写超过4GB的Ubuntu或Debian镜像时&#xff0c;是否遇到过SD卡工具报错&#xff1f;这不是你的操作问题&#xff0c;而是FAT32文件系统的天然限制。本文将带你深入理解这一技…...

Claude Tool Use 怎么用?从零到生产的完整教程(2026)

上周接了个需求&#xff0c;做一个能查天气、查数据库、还能发邮件的 AI 助手。一开始想着用 LangChain 套一层&#xff0c;后来发现 Claude 原生的 Tool Use&#xff08;也叫 Function Calling&#xff09;已经很成熟了&#xff0c;根本不需要额外框架。但官方文档写得有点绕&…...

Apollo自动驾驶系统C++核心模块实战解析——从源码到实现

1. Apollo自动驾驶系统架构全景解析 第一次打开Apollo源码仓库时&#xff0c;我完全被它庞大的代码量震撼到了——超过200万行C代码构成的自动驾驶系统&#xff0c;就像一座精密的机械钟表。但当你拆解它的核心模块后&#xff0c;会发现其架构设计处处体现着模块化和高内聚低耦…...