RaddioButton
Схожу функціональність з прапорцями надають перемикачі, які представлені класом 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;
}
}
}

OnCheckedChangeListener
Окрім обробки натискання на кожен окремий перемикач, ми можемо в цілому повісити на весь 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 вибрану радіокнопку і виконати певну обробку.