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, вказує, чи встановлено прапорець.

При зміні стану прапорця буде виводитися у спливаючому вікні відповідне повідомлення.