Android 自定义View实现任意布局的RadioGroup效果

作者:Black_Hao 时间:2021-08-07 16:20:24 

前言

RadioGroup是继承LinearLayout,只支持横向或者竖向两种布局。所以在某些情况,比如多行多列布局,RadioGroup就并不适用 。

本篇文章通过继承RelativeLayout实现自定义RadioGroup,实现RadioButton的任意布局。效果图如下:

Android 自定义View实现任意布局的RadioGroup效果

代码(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
  • asp之家 软件编程 m.aspxhome.com