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()方法