RadioButton

RadioButton представляет собой ещё один элемент списка, аналогичный CheckBox. Однако в отличие от него, RadioButton обладает двумя отличиями:

  1. RadioButton должен находиться в специальном контейнере RadioGroup.
  2. Если в наборе может быть выбрано несколько CheckBox, то RadioButton может быть выбран только один.

Поэтому предназначение RadioButton заключается в том, чтобы выбирать какой-то один пункт из списка. Причём выбор элемента списка происходит только в пределах контейнера: RadioButton, расположенные в разных контейнерах, друг с другом никак не связываются.

Перед тем, как создать RadioButton, нужно в коде разметки добавить контейнер RadioGroup.

<RadioGroup
    android:id="@+id/rafio_group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    >
</RadioGroup>

Добавить в контейнер RadioButton можно двумя способами: через XML и программно.

1. Добавление через XML

Для этого в коде разметки внутри <RadioGroup> нужно добавить <RadioButton>.

<RadioGroup
    android:id="@+id/rafio_group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    >
  <RadioButton
      android:id="@+id/radio1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 1"/>
  <RadioButton
      android:id="@+id/radio2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 2"/>
  <RadioButton
      android:id="@+id/radio3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 3"/>
</RadioGroup>

С помощью атрибута android:text можно задать текст, описывающий действие, происходящее при выборе пункта списка.

2. Добавление программно

Аналогично первому способу, сначала нужно добавить в разметку RadioGroup о задать ему идентификатор. После этого определяем его в коде разметки.

RadioGroup radioGroup = findViewById(R.id.radio_group);

Теперь нужно создать экземпляры RadioButton и добавить их в контейнер с помощью метода addView().

RadioButton radioButton1 = new RadioButton(this);
radioButton1.setText("Test 1");
radioGroup.addView(radioButton1);
RadioButton radioButton2 = new RadioButton(this);
radioButton2.setText("Test 2");
radioGroup.addView(radioButton2);
RadioButton radioButton3 = new RadioButton(this);
radioButton3.setText("Test 3");
radioGroup.addView(radioButton3);

Как видно, с помощью метода setText() можно задать текст для элемента. Получить текст можно с помощью метода getText().

Оба способа в результате  создадут список из трёх элементов.

Выбор элемента происходит с помощью клика пользователя, также разработчик может сам выбирать нужный элемент. Сделать это можно в коде разметки:

<RadioButton
    android:id="@+id/radio1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Test 1"
    android:checked="true"
    />

Или в коде активности:

radioButton1.setChecked(true);

Узнать, выбран ли элемент списка, можно с помощью метода isChecked(), который вернёт true, если элемент выбран, и false - не выбран.

Обрабатывать нажатия на элементы списка можно тремя разными способами:

1. Метод android:onClick

Аналогично любым другим компонентам, в XML можно задать атрибут android:onClick и передать в него имя метода, обрабатывающего нажатия.

<RadioGroup
    android:id="@+id/radio_group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    >
  <RadioButton
      android:id="@+id/radio1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="radioClick"
      android:text="Test 1"
      />
  <RadioButton
      android:id="@+id/radio2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="radioClick"
      android:text="Test 2"
      />
  <RadioButton
      android:id="@+id/radio3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="radioClick"
      android:text="Test 3"
      />
</RadioGroup>

Чтобы использовать метод для обработки кликов, он должен соответствовать следующим требованиям:

  • быть public
  • возвращать void
  • принимать в качестве единственного параметра экземпляр класса View

Затем в этом методе можно определять идентификатор нажатого элемента и выполнять соответствующие операции.

public void radioClick(View view) {
  boolean checked = ((RadioButton) view).isChecked();

  switch (view.getId()) {
    case R.id.radio1: {
      if (checked) {
        Toast.makeText(getApplicationContext(), "Первый элемент нажат", Toast.LENGTH_SHORT)
            .show();
      }
      break;
    }
    case R.id.radio2: {
      if (checked) {
        Toast.makeText(getApplicationContext(), "Второй элемент нажат", Toast.LENGTH_SHORT)
            .show();
      }
      break;
    }
    case R.id.radio3: {
      if (checked) {
        Toast.makeText(getApplicationContext(), "Третий элемент нажат", Toast.LENGTH_SHORT)
            .show();
      }
      break;
    }
  }
}

2. Метод setOnClickListener()

В коде активности можно создать экземпляр класса OnClickListener, который будет обрабатывать нажатия на элементы списка.

View.OnClickListener listener = new View.OnClickListener() {
  @Override public void onClick(View view) {
    boolean checked = ((RadioButton) view).isChecked();

    switch (view.getId()) {
      case R.id.radio1: {
        if (checked) {
          Toast.makeText(getApplicationContext(), "Первый элемент нажат", Toast.LENGTH_SHORT)
              .show();
        }
        break;
      }
      case R.id.radio2: {
        if (checked) {
          Toast.makeText(getApplicationContext(), "Второй элемент нажат", Toast.LENGTH_SHORT)
              .show();
        }
        break;
      }
      case R.id.radio3: {
        if (checked) {
          Toast.makeText(getApplicationContext(), "Третий элемент нажат", Toast.LENGTH_SHORT)
              .show();
        }
        break;
      }
    }
  }
};

Затем этот слушатель назначается кнопкам с помощью метода setOnClickListener().

RadioButton radioButton1 = findViewById(R.id.radio1);
RadioButton radioButton2 = findViewById(R.id.radio2);
RadioButton radioButton3 = findViewById(R.id.radio3);
radioButton1.setOnClickListener(listener);
radioButton2.setOnClickListener(listener);
radioButton3.setOnClickListener(listener);

3. Метод setOnCheckedChangeListener()

Предыдущий метод отслеживает сами нажатия, однако существует также метод setOnCheckedChangeListener(), который отслеживает изменение выбранного элемента в контейнере RadioGroup.

RadioGroup radioGroup = findViewById(R.id.radio_group);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  @Override public void onCheckedChanged(RadioGroup radioGroup, int i) {
    switch (i) {
      case R.id.radio1: {
        Toast.makeText(getApplicationContext(), "Первый элемент нажат", Toast.LENGTH_SHORT)
            .show();
        break;
      }
      case R.id.radio2: {
        Toast.makeText(getApplicationContext(), "Второй элемент нажат", Toast.LENGTH_SHORT)
            .show();
        break;
      }
      case R.id.radio3: {
        Toast.makeText(getApplicationContext(), "Третий элемент нажат", Toast.LENGTH_SHORT)
            .show();
        break;
      }
    }
  }
});

На всех трёх способах мы заранее знаем идентификаторы нажатых элементов. Однако если идентификатор нужно получить программно, это можно сделать с помощью метода getCheckedRadioButtonId().

RadioGroup radioGroup = findViewById(R.id.radio_group);
int id = radioGroup.getCheckedRadioButtonId();

При необходимости, можно изменить цвет кружка со стандартного на какой-либо другой. Для этого в папке res/values/styles.xml нужно создать новый стиль. Возьмём, например, основной цвет приложения.

<style name="MyRadioButton" parent="Widget.AppCompat.CompoundButton.RadioButton">
  <item name="colorAccent">@color/colorPrimary</item>
</style>

После этого в коде разметки для RadioButton нужно добавить атрибут android:theme и указать созданный стиль.

<RadioGroup
    android:id="@+id/radio_group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    >
  <RadioButton
      android:id="@+id/radio1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 1"
      android:textSize="14sp"
      android:theme="@style/MyRadioButton"
      />
  <RadioButton
      android:id="@+id/radio2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 2"
      android:textSize="14sp"
      android:theme="@style/MyRadioButton"
      />
  <RadioButton
      android:id="@+id/radio3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test 3"
      android:textSize="14sp"
      android:theme="@style/MyRadioButton"
      />
</RadioGroup>

В результате кнопки перекрасятся в тот цвет, который мы указали.

Дополнительные материалы

Использование XML Drawables в приложениях