Элементы 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 представляет альтернативный способ отслеживания изменения флажка. Этот слушатель срабатывает, когда мы устанавливаем или убираем отметку на флажке. Например, определим следующий 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 указывает, отмечен ли флажок.
При изменении состояния флажка будет выводиться во всплывающем окне соответствующее уведомление: