首页 > 解决方案 > onDateChanged 和 onCheckedChanged 一起工作

问题描述

在一项活动中,我有一个 datePicker(微调器),允许用户选择他们的出生日期,在此之下,用户还必须选择他们的性别。我有一个按钮,一旦设置了两个值(日期和性别),就会启用该按钮。我面临的问题是启用该按钮,尽管首先更改了哪个值。目前,用户必须选择他们的出生日期,然后选择他们的性别才能激活按钮。无论首先更改哪个值,我都希望启用该按钮。

这是我的代码:

final RadioGroup rGroup = findViewById(R.id.gender_radio_group);
RadioButton female_radio_button = rGroup.findViewById(rGroup.getCheckedRadioButtonId());
RadioButton male_radio_button = rGroup.findViewById(rGroup.getCheckedRadioButtonId());
RadioButton non_binary_radio_button = rGroup.findViewById(rGroup.getCheckedRadioButtonId());

//Check if datePicker and gender radiobutton has been used, if true enable button
calendar.setTimeInMillis(System.currentTimeMillis());
datePicker_birthday.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
  calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {

    @Override
    public void onDateChanged(DatePicker datePicker, int year, int month, int dayOfMonth) {

      // This overrides the radiogroup onCheckListener
      rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        public void onCheckedChanged(RadioGroup group, int checkedId) {
          // This will get the radiobutton that has changed in its check state
          RadioButton checkedRadioButton = group.findViewById(checkedId);
          // This puts the value (true/false) into the variable
          boolean isChecked = checkedRadioButton.isChecked();
          // If the radiobutton that has changed in check state is now checked...
          if (isChecked) {
            continue_register_birthday_gender_button.setEnabled(true);
            continue_register_birthday_gender_button.setBackground(ContextCompat.getDrawable(RegisterBirthDateAndGenderActivity.this,
              R.drawable.button_active));
          }
        }
      });

    }
  });

标签: javaandroid

解决方案


您的代码几乎没有问题。

  1. 如果用户首先选择单选按钮选择,则不会触发 rGroup.setOnCheckedChangeListener()。需要迁移到 onDateChanged() 之外。

  2. 重新定位后,它也不起作用,因为无线电组侦听器不知道 datePicker 条目是否也被更改。

  3. 用户可以选择先更新性别,再更新日期,反之亦然。可能的解决方案如下:

查看fixme评论。


// fixme: Add class variables (booleans) to keep track of changed ui items
  private Boolean isDatePickerOnDateChanged = false;
  private Boolean isRadioGroupOnCheckedChanged = false;

// fixme: Re-locate rGroup.setOnCheckedChangeListener(..) to here.
  RadioButton non_binary_radio_button = rGroup.findViewById(rGroup.getCheckedRadioButtonId());
  rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    public void onCheckedChanged(RadioGroup group, int checkedId) {
      //...
      isRadioGroupOnCheckedChanged = true;
      if (isDatePickerOnDateChanged && isRadioGroupOnCheckedChanged) {
        continue_register_birthday_gender_button.setEnabled(true);
      }

// fixme: Remove previous rGroup.setOnCheckedChangeListener(..) inside onDateChanged() to above
  datePicker_birthday.init(... {
    @Override
    public void onDateChanged(DatePicker datePicker, int year, int month, int dayOfMonth) {
      //...
      isDatePickerOnDateChanged = true;
      if (isDatePickerOnDateChanged && isRadioGroupOnCheckedChanged) {
        continue_register_birthday_gender_button.setEnabled(true);
      }

  1. 上述解决方案中的一些冗余代码:
      isRadioGroupOnCheckedChanged = true;
      if (isDatePickerOnDateChanged && isRadioGroupOnCheckedChanged) {
        continue_register_birthday_gender_button.setEnabled(true);
      }

可以简化为

      isRadioGroupOnCheckedChanged = true;
      if (isDatePickerOnDateChanged) {
        continue_register_birthday_gender_button.setEnabled(true);
      }

因为&& isRadioGroupOnCheckedChanged总是正确的,因为之前的陈述isRadioGroupOnCheckedChanged = true;


推荐阅读