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>
В результате кнопки перекрасятся в тот цвет, который мы указали.