Как сделать что-то при изменении состояния флажка?

Это мой код:

    <CheckBox
        android:id="@+id/sprint_checkbox"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/sprint_game" />

    <CheckBox
        android:id="@+id/marathon_checkbox"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/marathon" />

    <CheckBox
        android:id="@+id/never_ending_checkbox"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/never_ending" />

То, что я хочу сделать, это "обнаружить", когда один из них проверен, а затем установить остальные два "отключить", чтобы пользователь мог выбрать только один. Я пытался использовать ".setOnCheckedChangeListener", но я не могу этого сделать, может ли кто-нибудь помочь мне с некоторым кодом? Большое спасибо, ребята!

Ответ 1

Это уведомление о проверенных изменениях:

CheckBox check = findViewById(R.id.sprint_checkbox);
check.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            //do stuff

        }
    });

Вы также можете позволить своей деятельности реализовать интерфейс OnCheckedChangeListener, а затем:

CheckBox check1 = findViewById(R.id.sprint_checkbox);
CheckBox check2 = findViewById(R.id.marathon_checkbox); 
CheckBox check3 = findViewById(R.id.never_ending_checkbox);

check1.setOnCheckedChangeListener(this);
check2.setOnCheckedChangeListener(this);
check3.setOnCheckedChangeListener(this);

Переопределение метода интерфейса:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    switch(buttonView.getId()){
               case R.id.sprint_checkbox:
                 //do stuff
               break;
               case R.id.marathon_checkbox:
                 //do stuff
               break;
               case R.id.never_ending_checkbox:
                //do stuff
               break;

            }

}

Ответ 2

Я считаю, что RadioButton будет более подходящим для ваших целей.

<RadioGroup
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/radio_group1">
    <RadioButton
        android:id="@+id/sprint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/rad_option1"
        android:checked="true"
    android:onClick="onRadioButtonClick"
        />
    <RadioButton
        android:id="@+id/marathon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/rad_option2"
        android:onClick="onRadioButtonClick"
         />
    <RadioButton
        android:id="@+id/neverending"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/rad_option3"
        android:onClick="onRadioButtonClick"
         />
</RadioGroup>

Затем в вашем коде:

public void onRadioButtonClick(View v) {
    RadioButton button = (RadioButton) v;
    // DO YOUR THING HERE DEPENDING ON WHICH RADIOBUTTON IS PICKED
}

В этом случае вам не придется иметь дело с отключением других параметров. По умолчанию пользователь будет выбирать только один вариант.

Ответ 3

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    int id = buttonView.getId();

    if(isChecked){
       switch(id){
          case R.id.sprint:
          //add to database
          ...
       }
    }
    else{
      switch(id){
          case R.id.sprint:
          //remove from database
          ...
       }
   }
}

Это должно позволить вам использовать идентификаторы. Надеюсь, что это сработает.