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