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 вибрану радіокнопку і виконати певну обробку.