Схожую с флажками функциональность предоставляют переключатели, которые представлены классом RadioButton. Но в отличие от флажков единовременно в группе переключателей мы можем выбрать только один переключатель.
Чтобы создать список переключателей для выбора, вначале надо создать объект RadioGroup, который будет включать в себя все переключатели:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView android:id="@+id/selection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="26sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<RadioGroup
android:id="@+id/radios"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection"
>
<RadioButton android:id="@+id/java"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Java" />
<RadioButton android:id="@+id/kotlin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kotlin" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
Поскольку класс RadioGroup является производным от LinearLayout, то мы также можем задать вертикальную или
горизонтальную ориентацию списка, при том включив в него не только собственно переключатели, но и другие объекты, например, кнопку или TextView.
В классе MainActivity определим обработку выбора переключателей:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView selection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selection = findViewById(R.id.selection);
// устанавливаем обработчики для кнопок
findViewById(R.id.java).setOnClickListener((view)->onRadioButtonClicked(view));
// устанавливаем обработчики для кнопок
findViewById(R.id.kotlin).setOnClickListener((view)->onRadioButtonClicked(view));
}
public void onRadioButtonClicked(View view) {
RadioButton radio = (RadioButton) view;
// если переключатель отмечен
boolean checked = radio.isChecked();
// получаем текст нажатой радиокнопки
String text = radio.getText().toString();
// Получаем нажатый переключатель
switch(text) {
case "Java":
if (checked) selection.setText("Выбрана Java");
break;
case "Kotlin":
if (checked) selection.setText("Выбран Kotlin");
break;
}
}
}
Кроме обработки нажатия на каждый отдельный переколючатель мы можем в целом повесить на весь RadioGroup с его переключателями слушатель OnCheckedChangeListener и обрабатывать в нем нажатия. Для этого уберем из разметки у элемента RadioGroup определим id:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView android:id="@+id/selection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="26sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<RadioGroup
android:id="@+id/radios"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection">
<RadioButton android:id="@+id/java"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Java" />
<RadioButton android:id="@+id/kotlin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kotlin" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
Далее в коде MainActivity повесим на объект RadioGroup слушатель OnCheckedChangeListener:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView selection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selection = findViewById(R.id.selection);
// получаем объект RadioGroup
RadioGroup radios = findViewById(R.id.radios);
// обработка переключения состояния переключателя
radios.setOnCheckedChangeListener((radiogroup, id)-> {
// получае выбранную кнопку
RadioButton radio = findViewById(id);
switch (radio.getText().toString()) {
case "Java":
selection.setText("Выбрана Java");
break;
case "Kotlin":
selection.setText("Выбран Kotlin");
break;
default:
break;
}
});
}
}
Слушатель RadioGroup.OnCheckedChangeListener определяет метод onCheckedChanged(), в который передается объект RadioGroup и id выделенного переключателя. Далее также мы можем получить по id выбранную радиокнопку и выполнить определенную обработку.