Android 自定义View实现任意布局的RadioGroup效果
作者:Black_Hao 时间:2021-08-07 16:20:24
前言
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
标签:android,布局,radiogroup
0
投稿
猜你喜欢
Java中final变量使用总结
2022-09-29 08:32:00
Unity3D实现攻击范围检测
2023-07-02 12:12:39
Android基础教程数据存储之文件存储
2023-08-05 18:18:10
Android实现底部滚轮式选择弹跳框
2022-02-05 15:13:09
Java实现配置加载机制
2023-11-26 09:03:38
Unity游戏开发之2048游戏的实现
2023-04-19 00:11:33
SpringMVC使用RESTful接口案例详解
2022-08-08 23:41:52
JavaWeb入门:HttpResponse和HttpRequest详解
2022-09-05 16:44:31
Spring Cloud Gateway集成Sentinel流控详情
2023-11-09 20:27:31
Mybatis-plus全局id生成策略详解
2022-11-30 02:41:21
SpringBoot 嵌入式web容器的启动原理详解
2021-12-29 23:23:14
Java实现雪花算法的原理和实战教程
2021-11-20 18:20:41
出现SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.的解决方法
2021-09-01 12:02:09
Java基本数据类型(动力节点java学院整理)
2022-09-26 12:14:13
Bootstrap 下拉菜单.dropdown的具体使用方法
2023-07-08 19:10:46
让应用程序只运行一个实例的实现方法
2023-03-19 22:20:52
C#数据结构之堆栈(Stack)实例详解
2022-12-17 21:25:37
java中struts2实现简单的文件上传与下载
2022-12-23 22:53:21
浅析Disruptor高性能线程消息传递并发框架
2023-02-26 14:09:01
浅谈Android Studio如何Debug对应so文件C/C++代码
2023-11-20 03:23:35