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