RadioButton представляет собой ещё один элемент списка, аналогичный CheckBox. Однако в отличие от него, RadioButton обладает двумя отличиями:
- RadioButton должен находиться в специальном контейнере RadioGroup.
- Если в наборе может быть выбрано несколько 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>
В результате кнопки перекрасятся в тот цвет, который мы указали.




