25

RadioGroupにあるRadioButtonのプログラムによるチェックの問題に苦労してきました。check()1回の呼び出しで3つのイベントが発生するようです。1つは最初のRadioButtonで、2つは2番目のイベントです。これが私のターゲットです。同時に、インターフェイスの2番目のラジオボタンをクリックすると、1つのイベントのみが表示されます。これは正しいことです。

それで、複数のイベントの発生を回避する方法はありますか?

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);代わりに電話してください。


ソースコードをざっと見てみると、実際にOnCheckChangedListenerRadioGroup#check()が3回呼び出されていることがわかります...

  1. 現在の選択がチェックされていない場合、
  2. 新しいラジオボタンがチェックされている場合、および
  3. RadioGroupが保存するときに、どのRadioButtonがチェックされるようになりました。

奇妙な癖。

于 2012-04-21T23:45:23.977 に答える
4

メソッドにr.setOnCheckedChangeListener(onPromobuttonsClick);行を投稿するだけです。onResume()それは私のために働きます。

于 2016-05-05T06:45:13.623 に答える
1

これは古いものですが、私も同様の動作をしました。toggle()私が見つけた回避策は、のメソッドのRadioButton代わりにのcheck()メソッドを呼び出すことでしたRadioGroup

したがって、この例では、交換する必要があります

r.check(R.id.radio1);

b.toggle();

bはすでにidのビューであるためですR.id.radio1

于 2016-09-13T18:10:07.783 に答える
1

ラジオボタンの押下の分析をログに記録したいときにこの問題が発生しましたが、ラジオグループの呼び出しの処理方法により、.check()複数onCheckedChangeListener回呼び出されるようになりました(送信されるイベントが多すぎます)。

クリックごとに1つのイベントのみを取得するために、次の方法で処理しました。

// 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 に答える
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 に答える