RadioGroup调用onCheckedChanged()三次

时间:2012-04-21 22:58:37

标签: android radio-button radio-group

我一直在努力解决RadioButton的程序性检查问题,RadioButton位于RadioGroup中。似乎单个check()调用会引发三个事件 - 一个用于第一个RadioButton,两个用于第二个,这是我的目标。同时点击界面中的第二个RadioButton只会出现一个事件,这是正确的。

那么,有没有办法避免多次事件提升?

public class RadiogroupActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        RadioGroup r = (RadioGroup) findViewById(R.id.radioGroup1);
        RadioButton b = (RadioButton) findViewById(R.id.radio1);
        r.setOnCheckedChangeListener(onPromobuttonsClick);
        r.check(R.id.radio1);

    }

    private OnCheckedChangeListener onPromobuttonsClick = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            Log.d("x", "x");
        }
    };
}

4 个答案:

答案 0 :(得分:41)

  

那么,有没有办法避免多次事件提升?

改为呼叫b.setChecked(true);


快速查看source code确认RadioGroup#check()确实调用了OnCheckChangedListener三次......

  1. 取消选中当前选择时
  2. 选中新的RadioButton时,
  3. 当RadioGroup保存现在检查哪个RadioButton时。
  4. 奇怪的怪癖。

答案 1 :(得分:3)

只需在dependencies { compile 'com.android.support:support-v4:23.3.0' } 方法中发布您的r.setOnCheckedChangeListener(onPromobuttonsClick);行。这对我有用。

答案 2 :(得分:0)

所以这是一个旧的,但我也有类似的行为。我找到的解决方法是调用toggle()的{​​{1}}方法,而不是RadioButton的{​​{1}}方法。

所以在这个例子中,你只需要交换

check()

RadioGroup

因为r.check(R.id.radio1); 已经是ID为b.toggle(); 的视图。

答案 3 :(得分:0)

当我想记录单选按钮按下的分析时,我遇到了这个问题,但是使用.check()处理无线电组呼叫的方式导致onCheckedChangeListener被多次调用(发送的次数过多)事件)。

我按以下方式处理它,每次点击只能获得一个事件:

// create listeners so we don't duplicate the creation in for loop
View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // whatever you want to do here
    }
};

// add on click listener to all radio buttons
int buttonCount = buttonGroup.getChildCount();
for (int i = 0; i < buttonCount; i++) {
    if (buttonGroup.getChildAt(i) instanceof RadioButton) {
        buttonGroup.getChildAt(i).setOnClickListener(onClickListener);
    }
}