Android 自定义View实现任意布局的RadioGroup效果
作者:Black_Hao 发布时间:2021-08-07 16:20:24
标签:android,布局,radiogroup
前言
RadioGroup是继承LinearLayout,只支持横向或者竖向两种布局。所以在某些情况,比如多行多列布局,RadioGroup就并不适用 。
本篇文章通过继承RelativeLayout实现自定义RadioGroup,实现RadioButton的任意布局。效果图如下:
代码(RelativeRadioGroup)
/**
* Author : BlackHao
* Time : 2018/10/26 10:46
* Description : 自定义 RadioGroup
*/
public class RelativeRadioGroup extends RelativeLayout implements CompoundButton.OnCheckedChangeListener {
private int checkId = -1;
private CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener;
public RelativeRadioGroup(Context context) {
super(context);
}
public RelativeRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RelativeRadioGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//添加监听
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
if (v instanceof RadioButton && !(v instanceof CompoundButton.OnCheckedChangeListener)) {
((RadioButton) v).setOnCheckedChangeListener(this);
}
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setCheck(buttonView.getId(), isChecked);
}
public void check(@IdRes int checkId) {
if (checkId == -1 || this.checkId == checkId) {
return;
}
setCheck(checkId, true);
}
public void clearCheck() {
setCheck(-1, false);
}
public int getCheckedRadioButtonId() {
return this.checkId;
}
/**
* 设置选中状态
*/
private void setCheck(@IdRes int checkId, boolean isChecked) {
if (checkId != -1 && this.checkId == checkId) {
return;
}
if (checkId != -1) {
CompoundButton view = (CompoundButton) findViewById(checkId);
//未选中的RadioButton被选中
if (checkId != this.checkId && isChecked) {
this.checkId = checkId;
if (mChildOnCheckedChangeListener != null) {
mChildOnCheckedChangeListener.onCheckedChanged(view, true);
}
//某个RadioButton被选中,将其他的改为未选中
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
if (v instanceof RadioButton && v.getId() != checkId) {
((RadioButton) v).setChecked(false);
} else if (v instanceof RadioButton && v.getId() == checkId) {
((RadioButton) v).setChecked(true);
}
}
}
//被选中的RadioButton被取消选中
if (checkId == this.checkId && !isChecked) {
this.checkId = checkId;
if (mChildOnCheckedChangeListener != null) {
mChildOnCheckedChangeListener.onCheckedChanged(view, false);
}
}
} else {
//清空所有选择
if (this.checkId != -1) {
this.checkId = -1;
CompoundButton view = (CompoundButton) findViewById(this.checkId);
//将选中的置为未选中
if (view instanceof RadioButton) {
view.setChecked(false);
}
}
}
}
public void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener) {
this.mChildOnCheckedChangeListener = mChildOnCheckedChangeListener;
}
}
代码并没有太多,也很容易理解。有什么不明白的可以留言。
1、下载地址 : https://github.com/LuoChen-Hao/BlackHaoCustomView
总结
以上所述是小编给大家介绍的Android 自定义View实现任意布局的RadioGroup效果网站的支持!
来源:https://blog.csdn.net/a512337862/article/details/83541995


猜你喜欢
- 1.前言APP冷启动比较慢,点击桌面图片需要用户等待很久,体验较差。2.APP启动方式冷启动(Cold start)场景:冷启动是指APP在
- 本文实例讲述了C#找出字符串中第一个字母并大写的方法。分享给大家供大家参考,具体如下:class Program{ static
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- 目录1 任务状态手动控制任务启动确保任务已激活2 任务取消3 进度报告4 Task.Yield 让步5 定制异步任务后续操作Configur
- 如何打印GC日志排查问题在工作当中,有时候我们会需要打印GC的相关信息来定位问题。该如何做呢?先来看个示例public static voi
- 前言5个xml文件实现 按钮的圆角、阴影效果以及按下变化效果实现drawable/shape.xml<?xml version=&qu
- 设置Spring的作用域或者使用枚举值设置单例和多里使用场景自动注入@Primary一个接口有多个实现被spring管理吗,在依赖注入式,s
- 目录示例1: EncryptByAes示例2: main示例3: wrapperPublicPriviteKeyTest示例4: initH
- 1 Mybatis-Plus简介Mybatis-Plus 提供了多种方式来执行 SQL,包括使用注解、XML 映射文件和 Lambda 表达
- 今天用NewtonSoft.JSon解析一个天气数据,数据格式如:{"status":1,"detail&qu
- 当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中
- 本文实例为大家分享了Android百度地图定位、显示用户当前位置的工具类,供大家参考,具体内容如下1、构建定位Option的工具类impor
- //路径, 添加开机启动/删除开机启动 public s
- 导语在使用flutter 自带图片组件的过程中,大家有没有考虑过flutter是如何加载一张网络图片的? 以及对自带的图片组件我们可以做些什
- 写了一个java数组排序示例,这里分享给大家共同学习package com.yonyou.test;import java.util.Arr
- 前言:本质上来说,CoreCLR 也是 C++ 写的,所以也逃不过用 虚表 来实现多态的玩法, 不过玩法也稍微复杂了一些,希望本篇对大家有帮
- 有个网站需要生成静态页。据以往经验,凡比较烂的空间,短时间内运行耗能大的运算,都会出现“service unavailable”,以致网页无
- 这篇文章主要介绍了Spring事务失效问题分析及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 一、使用嵌入式关系型SQLite数据库存储数据在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NUL
- Nacos简介Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队