25

我一直在努力解决位于 RadioGroup 中的 RadioButton 的编程检查问题。似乎一次check()调用会引发三个事件 - 第一个 RadioButton 一次,第二个 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

5 回答 5

54

那么,有没有办法避免多个事件引发?

b.setChecked(true);改为打电话。


快速浏览源代码确认RadioGroup#check()确实确实调用了 OnCheckChangedListener 三次......

  1. 当前选择未选中时,
  2. 当新的 RadioButton 被选中时,并且
  3. 当 RadioGroup 保存现在检查哪个 RadioButton 时。

奇怪的怪癖。

于 2012-04-21T23:45:23.977 回答
4

只需在方法中发布您的r.setOnCheckedChangeListener(onPromobuttonsClick);线路。onResume()它对我有用。

于 2016-05-05T06:45:13.623 回答
1

当我想记录单选按钮按下的分析时,我遇到了这个问题,但是处理单选组呼叫的方式.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);
    }
}
于 2017-01-13T19:07:19.793 回答
1

所以这是一个旧的,但我也有类似的行为。我发现的一种解决方法是调用toggle()方法RadioButton而不是check()方法RadioGroup

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

r.check(R.id.radio1);

b.toggle();

因为b已经是 id 的视图R.id.radio1

于 2016-09-13T18:10:07.783 回答
0

这是一个老问题,但我还没有找到涵盖我的问题的完整答案。但是感谢#Hellojeffy 的建议,我想出了一种方法来处理 RadioButton 在使用setOnCheckedChangeListener(). 这个想法是在每个视图上添加一个点击RadioGroup并在点击时触发一个事件,而不是在检查更改时触发一个事件。

for (child in radioButtonGroup.children) {
            if (child is RadioButton) {
                when (child.id) {
                    R.id.rb1 -> child.setOnClickListener { onRb1Click(...) }
                    R.id.rb2 -> child.setOnClickListener { onRb1Click(...) }
                    R.id.rb3 -> child.setOnClickListener { onRb1Click(...) }
                        ...
                }
            }
        }
于 2022-01-05T19:20:37.767 回答