前言

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;

}

}

代码并没有太多,也很容易理解。有什么不明白的可以留言。

总结

以上所述是小编给大家介绍的Android 自定义View实现任意布局的RadioGroup效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

android自定义radiogroup,Android 自定义View实现任意布局的RadioGroup效果相关推荐

  1. Android Canvas制作一个可以拖动改变任意形状的四边形效果,并填充颜色

    先上效果图: 思路: 1. 定义四个点, 初始化四个点的坐标,绘制点. 2. 绘制 直线,把四个点连接起来. 3. 根据四个点的坐标绘制直线路径,填充颜色. 4. 判断手势是否点中四个点的坐标范围内. ...

  2. Android自定义控件入门到精通--View树的布局

    <Android自定义控件入门到精通>文章索引 ☞ https://blog.csdn.net/Jhone_csdn/article/details/118146683 <Andro ...

  3. Android面试收集录12 View测量、布局及绘制原理

    一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...

  4. Android最简单的实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单 ...

  5. Android 自定义View实现圆形头像(适用于任意布局)

    先看效果图: 先来说下我的思路:首先我需要在自定义View中动态获取头像id,那么就需要在attrs文件中,写一个关于该View类的自定义属性.这里仿照ImageView,取名为src,类型为refe ...

  6. android 自定义 child,Android自定义View

    前言 Android自定义View的详细步骤是我们每一个Android开发人员都必须掌握的技能,因为在开发中总会遇到自定义View的需求.为了提高自己的技术水平,自己就系统的去研究了一下,在这里写下一 ...

  7. android java 圆角_Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

  8. android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

  9. android炫酷的自定义view,Android自定义View实现炫酷进度条

    本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...

最新文章

  1. keepalived and heartbeat
  2. Python系列教程之学生信息管理系统
  3. Jsp—02—项目:登录案例
  4. 2204 Problem A(水)
  5. 计算机的键盘功能,电脑键盘功能
  6. mysql 实验_实验二 MySQL 实验.doc
  7. 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15
  8. 子类重载父类函数_Python面向对象之继承、重写与重载
  9. (转) 通过UUID在vSphere虚拟机内外识别硬盘
  10. bootstrap思想总结_bootstrap学习心得总结-css样式设计分享
  11. 传教士与野人过河问题
  12. 我的MacOS上的软件
  13. python如何爬有道翻译_Python爬虫爬有道翻译
  14. python re 查找字符串中是否含有汉字
  15. 战火与秩序迁城显示服务器忙,战火与秩序迁城方法介绍
  16. 国内下载国外数据集(库)方案整理
  17. Photoshop脚本 合并所有图层
  18. 苹果手机显示无法与服务器建立安全连接,苹果手机那个safari浏览器无法与访问器建立安全链接是什么意思...
  19. BOSS管账深度融合钉能力,打破业财数据壁垒实现数据互通
  20. 华为鸿蒙电视配置,华为旗下荣耀智慧屏PRO55英寸AI摄像头鸿蒙系统4K超清电视机...

热门文章

  1. 一篇文章把本该属于你的源码天赋还给你
  2. 2017移动开发年终盘点
  3. 使用convert命令改变图片的分辨率
  4. WebService 教程(包含项目实践)
  5. 智能物料搬运小车机械部分设计思路
  6. ubuntu 下载电影问题
  7. Sublime Text3下配置SublimeLinter进行PHP代码检查
  8. 怎样在苹果Mac上格式化USB闪存驱动器
  9. python怎样将文字排成圆形_python之词云设计-圆形图案
  10. SOM-TL665x是TI系列多核架构的定点/浮点TMS320C665x高端DSP核心板