onDateChanged и onCheckedChanged работают вместе - PullRequest
0 голосов
/ 27 апреля 2020

В одном упражнении у меня есть 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));
          }
        }
      });

    }
  });

1 Ответ

1 голос
/ 27 апреля 2020

Мало проблем с вашим кодом.

  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);
      }

Немного кода избыточности в приведенном выше решении:
      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;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...