Checkbox
Елементи Checkbox являють собою прапорці, які можуть перебувати в поміченому і не поміченому стані. Прапорці дають змогу робити множинний вибір із кількох значень. Отже, визначимо у файлі розмітки activity_main.xml елемент CheckBox:
<?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"/>
<CheckBox android:id="@+id/enabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Включить"
android:textSize="26sp"
android:onClick="onCheckboxClicked"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Атрибут android:onClick, як і у випадку з простими кнопками, дає змогу задати обробник натискання на прапорець. Визначимо обробник натискання в коді MainActivity:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCheckboxClicked(View view) {
// Отримуємо прапорець
CheckBox checkBox = (CheckBox) view;
TextView selection = findViewById(R.id.selection);
// Отримуємо, чи відмічений цей прапорець
if(checkBox.isChecked()) {
selection.setText("Включено");
checkBox.setText("Выключить");
}
else {
selection.setText("Выключено");
checkBox.setText("Включить");
}
}
}
Як параметр в обробник натискання onCheckboxClicked передається натиснутий прапорець. Обробник спрацьовує при кожному натисканні на checkBox. Тобто і коли ми встановлюємо прапорець, і коли ми знімемо позначку. За допомогою методу isChecked() можна дізнатися, чи виділений прапорець - у цьому разі метод повертає true.
Подібним чином можна використовувати кілька прапорців:
<?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"/>
<CheckBox android:id="@+id/java"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Java"
android:textSize="26sp"
android:onClick="onCheckboxClicked"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection"/>
<CheckBox android:id="@+id/kotlin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kotlin"
android:textSize="26sp"
android:onClick="onCheckboxClicked"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/java"/>
</androidx.constraintlayout.widget.ConstraintLayout>
На кожен прапорець можна повісити свій обробник натискання. А можна зробити один, як у цьому випадку. У цьому випадку ми можемо обробити кілька прапорців у коді java за допомогою конструкції switch...case
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCheckboxClicked(View view) {
// Отримуємо прапорець
CheckBox checkBox = (CheckBox) view;
// Отримуємо, чи відмічений цей прапорець
boolean checked = checkBox.isChecked();
TextView selection = findViewById(R.id.selection);
// Дивимося, який саме з прапорців відзначений
switch(view.getId()) {
case R.id.java:
if (checked)
Toast.makeText(this, "Вы выбрали Java ",Toast.LENGTH_LONG).show();
break;
case R.id.kotlin:
if (checked)
Toast.makeText(this, "Вы выбрали Kotlin",Toast.LENGTH_LONG).show();
break;
default:
selection.setText("");
}
}
}
За допомогою конструкції switch...case можна отримати id натиснутого прапорця і виконати відповідні дії.

Щоправда, якщо нам просто треба взяти текст з обраного прапорця, то необов'язково в цьому разі використовувати конструкцію switch, адже ми можемо скоротити весь код таким чином:
public void onCheckboxClicked(View view) {
// Отримуємо прапорець
CheckBox language = (CheckBox) view;
// Отримуємо, чи відмічений цей прапорець
TextView selection = findViewById(R.id.selection);
if(language.isChecked())
selection.setText(language.getText());
}
Однак у цьому випадку залишається проблема: у текстовому полі відображається тільки один виділений елемент. Змінимо код MainActivity, щоб відображати обидва виділені елементи:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCheckboxClicked(View view) {
// Отримуємо прапорці
CheckBox java = findViewById(R.id.java);
CheckBox kotlin = findViewById(R.id.kotlin);
String selectedItems = "";
if(java.isChecked())
selectedItems +=java.getText() + " ";
if(kotlin.isChecked())
selectedItems +=kotlin.getText();
TextView selection = findViewById(R.id.selection);
selection.setText(selectedItems);
}
}

OnCheckedChangeListener
Застосування слухача OnCheckedChangeListener представляє альтернативний спосіб відстеження зміни прапорця. Цей слухач спрацьовує, коли ми встановлюємо або прибираємо позначку на прапорці. Наприклад, визначимо наступний checkbox:
<?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"/>
<CheckBox android:id="@+id/enabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Включить"
android:textSize="26sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection"/>
</androidx.constraintlayout.widget.ConstraintLayout>
У коді MainActivity підключимо обробник зміни стану:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView selection = findViewById(R.id.selection);
CheckBox enableBox = findViewById(R.id.enabled);
enableBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
selection.setText("Включено");
buttonView.setText("Выключить");
}
else {
selection.setText("Выключено");
buttonView.setText("Включить");
}
}
});
}
}
Слухач OnCheckedChangeListener визначений у базовому класі CompoundButton і містить один метод — onCheckedChanged.
- Перший параметр цього методу,
buttonView, — це сам змінений прапорецьCheckBox. - Другий параметр,
isChecked, вказує, чи встановлено прапорець.
При зміні стану прапорця буде виводитися у спливаючому вікні відповідне повідомлення.

