RadioGroup使用你可能没有遇到的问题

12 篇文章 0 订阅
11 篇文章 0 订阅

RadioGroup不是很常用很简单的组件吗,还需要拿来说,是的,因为今天开发过程中遇到一个有趣的事情,为了实现一个单选功能。很熟练的使用setOnCheckedChangeListener()回调判断是否选中,处理选中后的事件,代码如下:

//选中事件
        hangLocalGroup.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                //挂本地团
                if (b) {
                    onHangLocalGroup();
                }
            }
        });
        hangGoods.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                //挂商品
                if (b) {
                    onHangGoods();
                }
            }
        });

再通过radioGroup 来控制它选中和未选中的样式,代码如下:

//控制选中样式
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                for (int j = 0; j < radioGroup.getChildCount(); j++) {
                    RadioButton rb = (RadioButton) radioGroup.getChildAt(j);
                    setState(rb, rb.isChecked());
                }
            }
        });

一切都现的很自然。但是这个时候,问题出现了,用户点击了hangGoods 事件,取选择商品,选完后用户想换一个,再次点击hangGoods的setOnCheckedChangeListener回调没有反应,什么情况。
然后还要再一定条件下,点击hangGoods 如果满足一定条件,点击无效。这还不简单hangGoods.setChecked(false);结果,我才点击hangLocalGroup和hangGoods ,hangGoods 的状态不会变。这么坑的吗。为了解决这个问题,代码如下

public class InterceptRadioGroup extends RadioGroup {
    private final String TAG = "InterceptRadioGroup";

    private int checkId;
    private AlertDialog dialog;

    public InterceptRadioGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            RadioButton child = (RadioButton) getChildAt(i);
            int x = (int) ev.getX();
            int y = (int) ev.getY();
            int left = child.getLeft();
            int right = child.getRight();
            int top = child.getTop();
            int bottom = child.getBottom();
            Log.d(TAG, "x=" + x + "|x=" + x);
            Log.d(TAG, "left=" + left + "|right=" + right);
            Log.d(TAG, "top=" + top + "|bottom=" + bottom);
            if (x < right && x > left && y > top && y < bottom) {
                checkId = child.getId();
                if (mOnCheckedListener != null) {
                    mOnCheckedListener.onCheck(checkId);
                }
                break;
            }
        }
        return true;
    }

    public void check() {
        check(checkId);
    }

    public interface OnCheckedListener {
        void onCheck(int i);
    }

    private OnCheckedListener mOnCheckedListener;

    public void setOnCheckedListener(OnCheckedListener onCheckedListener) {
        mOnCheckedListener = onCheckedListener;
    }

我重写了RadioGroup ,通过它的onInterceptTouchEvent方法来拦截它的点击事件,满足条件调用check()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值