RadioGroup的一个bug

如果设置了默认选择,也没有给RadioButton添加ID,那么将没办法取消选择了。

<RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">

    <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content"/>

    <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true"/>

</RadioGroup>

这个bug的原因:

RadioGroup在设置选择项的时候,RadioButton没有自动生成ID,导致选择项的ID为-1,等同于没选择。

创建流程:

  1. RadioButton创建
  2. RadioButton设置选中状态
  3. RadioGroup设置选中项(setCheckedId)
  4. RadioButton创建完成,添加到RadioGroup中

RadioButton创建的时候,回调onCheckedChanged()

private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // prevents from infinite recursion
        if (mProtectFromCheckedChange) {
            return;
        }

        mProtectFromCheckedChange = true;
        if (mCheckedId != -1) {
            setCheckedStateForView(mCheckedId, false);
        }
        mProtectFromCheckedChange = false;

        int id = buttonView.getId();//这里是-1
        setCheckedId(id);
    }
}

RadioButton创建完成,添加到RadioGroup中

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
    if (child instanceof RadioButton) {
        final RadioButton button = (RadioButton) child;
        if (button.isChecked()) {
            mProtectFromCheckedChange = true;
            if (mCheckedId != -1) {
                setCheckedStateForView(mCheckedId, false);
            }
            mProtectFromCheckedChange = false;
            setCheckedId(button.getId());
        }
    }

    super.addView(child, index, params);
}

// 这里才生成ID (在add/removeView的时候回调)
public void onChildViewAdded(View parent, View child) {
    if (parent == RadioGroup.this && child instanceof RadioButton) {
        int id = child.getId();
        // generates an id if it's missing
        if (id == View.NO_ID) {
            id = View.generateViewId();
            child.setId(id);
        }
        ((RadioButton) child).setOnCheckedChangeWidgetListener(
                mChildOnCheckedChangeListener);
    }

    if (mOnHierarchyChangeListener != null) {
        mOnHierarchyChangeListener.onChildViewAdded(parent, child);
    }
}

最简单的解决办法:

给RadioButton加个ID

如果是动态添加RadioButton:参考这里(stackoverflow.com)

发表评论

电子邮件地址不会被公开。 必填项已用*标注