ToggleButton (кнопка-переключатель) позволяет пользователю изменять состояние кнопки с On на Off или наоборот. О текущем состоянии кнопки сообщает надпись на ней и индикатор под кнопкой.
Предназначение этого виджета заключается в том, чтобы менять состояние кнопки и выполнять соответствующие операции. Например, его можно использовать как индикатор включения/выключения звука, Wi-Fi, Bluetooth и т.п.
На данный момент этот компонент не так распространён, поскольку в Android SDK был добавлен виджет Switch, выполняющий схожие задачи.
Текст, отображаемый в состояниях кнопки, можно изменить. Делается это либо через XML, либо программно:
- Через XML. Для этого нужно в разметке, где определён виджет ToggleButton, добавить атрибуты android:textOn и android:textOff. Например:
<ToggleButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textOff="Выключен" android:textOn="Включен" />В этом случае стандартные On и Off будут заменены на то, что мы написали в значение атрибутов.

- Программно. Для начала добавим идентификатор для кнопки.
<ToggleButton android:id="@+id/toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" />Затем определим кнопку в коде активности и вызовем методы setTextOff() и setTextOn(), чтобы задать текст для выключенного и включенного состояния соответственно.
ToggleButton toggle = findViewById(R.id.toggle); toggle.setTextOff("Выключен"); toggle.setTextOn("Включен");
Обрабатывать нажатия на ToggleButton можно через метод setOnCheckedChangeListener() или через интерфейс OnCheckedChangeListener (о том, как пользоваться интерфейсами, описано здесь). Добавим для кнопки слушатель, который будет отслеживать состояние кнопки.
ToggleButton toggle = findViewById(R.id.toggle);
toggle.setTextOff("Выключен");
toggle.setTextOn("Включен");
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isChecked()) {
Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Not checked", Toast.LENGTH_SHORT).show();
}
}
});
Узнать текущее состояние кнопки можно с помощью метода isChecked(), который возвращает false, если кнопка в выключенном состоянии, и true — в включенном.
Также имеется возможность задать состояние программно. Для этого нужно вызвать метод setChecked(), например.
ToggleButton toggle = findViewById(R.id.toggle);
toggle.setTextOff("Выключен");
toggle.setTextOn("Включен");
toggle.setChecked(false); // изменит состояние кнопки на выключенное
toggle.setChecked(true); // изменит состояние кнопки на включенное
Кроме того, можно использовать функционал ToggleButton иначе. Например, можно сделать из компонента кнопку Like. Для этого создадим селектор, который будет подставлять нужный фон в зависимости от состояния.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_favorite_black_24dp" android:state_checked="true" android:state_pressed="true"/> <item android:drawable="@drawable/ic_favorite_black_24dp" android:state_checked="true" android:state_focused="false"/> <item android:drawable="@drawable/ic_favorite_border_black_24dp" android:state_checked="false" android:state_pressed="true"/> <item android:drawable="@drawable/ic_favorite_border_black_24dp" android:state_checked="false" android:state_focused="false"/> </selector>
Затем в коде разметки укажем этот селектор в качестве фона и уберем текст в обоих состояниях.
<ToggleButton
android:id="@+id/toggle"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerInParent="true"
android:background="@drawable/toggle_selector"
android:textOff=""
android:textOn=""
/>
В результате получили простую кнопку, которая при смене состояния меняет свой фон на указанный в селекторе.



