Back to Material Components Android

Switch

docs/components/Switch.md

1.13.017.2 KB
Original Source
<!--docs: title: "Switch" layout: detail section: components excerpt: "Selection controls allow the user to select options." iconId: switch path: /catalog/switches/ -->

Switch

Switches toggle the state of a single setting on or off.

Note: Images use various dynamic color schemes.

Switches are best used to adjust settings and other standalone options. They make a binary selection, like on and off or true and false.

The effects of a switch should start immediately, without needing to save.

Design & API documentation

Anatomy

  1. Track
  2. Handle (formerly "thumb")
  3. Icon

More details on anatomy items in the component guidelines.

Key properties

Switch attributes

ElementAttributeRelated method(s)Default value
Min heightandroid:minHeightsetMinHeight
getMinHeight?attr/minTouchTargetSize

Thumb attributes

ElementAttributeRelated method(s)Default value
Thumbandroid:thumbsetThumbDrawable
getThumbDrawable@drawable/mtrl_switch_thumb
Colorapp:thumbTintsetThumbTintList
getThumbTintList?attr/colorOutline (unchecked)
?attr/colorOnPrimary (checked)

Icon attributes

You can add an optional icon to enhance the on/off indication of your custom switch by assigning app:thumbIcon. This icon will be centered and displayed on top of the thumb drawable.

ElementAttributeRelated method(s)Default value
Iconapp:thumbIconsetThumbIconDrawable
getThumbIconDrawablenull
Sizeapp:thumbIconSizesetThumbIconSize
getThumbIconSize16dp
Colorapp:thumbIconTintsetThumbIconTintList
getThumbIconTintList?attr/colorSurfaceContainerHighest (unchecked)
?attr/colorOnPrimaryContainer (checked)

Track attributes

ElementAttributeRelated method(s)Default value
Trackapp:tracksetTrackDrawable
getTrackDrawable@drawable/mtrl_switch_track
Colorapp:trackTintsetTrackTintList
getTrackTintList?attr/colorSurfaceContainerHighest (unchecked)
?attr/colorPrimary (checked)
Decorationapp:trackDecorationsetTrackDecorationDrawable
getTrackDecorationDrawable@drawable/mtrl_switch_track_decoration
(Shows an outline of the track.)
Decoration colorapp:trackDecorationTintsetTrackDecorationTintList
getTrackDecorationTintList?attr/colorOutline (unchecked)
@android:color/transparent (checked)

Text label attributes

ElementAttributeRelated method(s)Default value
Text labelandroid:textsetText
getTextnull
Colorandroid:textColorsetTextColor
getTextColors?android:attr/textColorPrimaryDisableOnly
Typographyandroid:textAppearancesetTextAppearance?attr/textAppearanceBodyMedium
Paddingapp:switchPaddingsetSwitchPadding
getSwitchPadding16dp

Switch states

Switches can be on or off. Switches have enabled, hover, focused, and pressed states.

Styles

ElementStyleTheme attribute
Default styleWidget.Material3.CompoundButton.MaterialSwitch?attr/materialSwitchStyle

For the full list, see styles and attrs.

Code implementation

Before you can use Material switches, you need to add a dependency on the Material components for Android library. For more information, go to the Getting started page.

Note: The MaterialSwitch widget provides a complete implementation of Material Design's switch component. It extends from the support library's SwitchCompat widget, but not from the framework Switch widget. As such, it does not auto-inflate, unlike other selection controls, and must be explicitly specified in layouts.

Note: For the old SwitchMaterial documentation, please refer to Switch (deprecated) and Theming switch (deprecated).

Adding switch

A Switch represents a button with two states, on and off. Switches are most often used on mobile devices to enable and disable options in an options menu. A switch consists of a track and thumb; the thumb moves along the track to indicate its current state.

Use switches to:

  • Toggle a single item on or off
  • Immediately activate or deactivate something

The following example shows a list of five switches.

In the layout:

xml
<com.google.android.material.materialswitch.MaterialSwitch
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:checked="true"
    android:text="@string/label_1"/>
<com.google.android.material.materialswitch.MaterialSwitch
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_2"/>
<com.google.android.material.materialswitch.MaterialSwitch
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_3"/>
<com.google.android.material.materialswitch.MaterialSwitch
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_4"/>
<com.google.android.material.materialswitch.MaterialSwitch
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:enabled="false"
    android:text="@string/label_5"/>

In code:

kt
// To check a switch
materialSwitch.isChecked = true

// To listen for a switch's checked/unchecked state changes
materialSwitch.setOnCheckedChangeListener { buttonView, isChecked
    // Responds to switch being checked/unchecked
}

Making switch accessible

Switches support content labeling for accessibility and are readable by most screen readers, such as Talkback. Text rendered in switches is automatically provided to accessibility services. Additional content labels are usually unnecessary.

Customizing switch

Theming switch

Switch supports the customization of color and typography.

Switch theming example

API and source code:

Note: Since version 1.7.0, the new MaterialSwitch class will replace the obsolete SwitchMaterial class. In most cases you should be able to just replace all SwitchMaterial class reference with MaterialSwitch to achieve the default look and feel. Please refer to the following sections if you need to customize the new styles.

The following example shows a list of switches with Material theming.

Implementing switch theming

Use theme attributes in res/values/styles.xml, which applies to all switches and affects other components:

xml
<style name="Theme.App" parent="Theme.Material3.*">
    ...
    <item name="colorPrimary">@color/pink_200</item>
    <item name="colorSurfaceVariant">@color/pink_100</item>
</style>

Use default style theme attributes, styles and theme overlays, which apply to all switches but do not affect other components:

xml
<style name="Theme.App" parent="Theme.Material3.*">
    ...
    <item name="materialSwitchStyle">@style/Widget.App.Switch</item>
</style>

<style name="Widget.App.Switch" parent="Widget.Material3.CompoundButton.MaterialSwitch">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Switch</item>
</style>

<style name="ThemeOverlay.App.Switch" parent="">
    <item name="colorPrimary">@color/pink_200</item>
    <item name="colorSurfaceVariant">@color/pink_100</item>
</style>

Use the styles in the layout, which affects only this switch:

xml
<com.google.android.material.materialswitch.MaterialSwitch
        ...
    style="@style/Widget.App.Switch"
    />
<details> <summary><h2 id="switch-deprecated">Switch (deprecated)</h2></summary>

The following example shows a list of five switches.

In the layout:

xml
<com.google.android.material.switchmaterial.SwitchMaterial
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:checked="true"
    android:text="@string/label_1"/>
<com.google.android.material.switchmaterial.SwitchMaterial
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_2"/>
<com.google.android.material.switchmaterial.SwitchMaterial
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_3"/>
<com.google.android.material.switchmaterial.SwitchMaterial
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="@string/label_4"/>
<com.google.android.material.switchmaterial.SwitchMaterial
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:enabled="false"
    android:text="@string/label_5"/>

In code:

kt
// To check a switch
switchmaterial.isChecked = true

// To listen for a switch's checked/unchecked state changes
switchmaterial.setOnCheckedChangeListener { buttonView, isChecked
    // Responds to switch being checked/unchecked
}

Anatomy

  1. Thumb
  2. Track

Key properties

Switch attributes

ElementAttributeRelated method(s)Default value
To use material colorsapp:useMaterialThemeColorssetUseMaterialThemeColors
isUseMaterialThemeColorstrue (ignored if specific tint attrs are set)
Min sizeandroid:minWidth
android:minHeight(set/get)MinWidth
(set/get)MinHeight?attr/minTouchTargetSize

The color of the switch defaults to using ?attr/colorPrimary, ?attr/colorPrimaryContainer, ?attr/colorOnSurface, and ?attr/colorOutline defined in your app theme. If you want to override this behavior, as you might with a custom drawable that should not be tinted, set app:useMaterialThemeColors to false:

xml
<com.google.android.material.switchmaterial.SwitchMaterial
        ...
    app:useMaterialThemeColors="false"
    />

Thumb attributes

ElementAttributeRelated method(s)Default value
Thumbandroid:thumbsetThumbDrawable
getThumbDrawableinherits from SwitchCompat
Colorapp:thumbTintsetThumbTintList
getThumbTintList?attr/colorOnSurface (unchecked)
?attr/colorPrimary (checked)
ElevationN/AN/A4dp

Track attributes

ElementAttributeRelated method(s)Default value
Trackapp:tracksetTrackDrawable
getTrackDrawableinherits from SwitchCompat
Colorapp:trackTintsetTrackTintList
getTrackTintList?attr/colorOutline (unchecked)
?attr/colorPrimaryContainer (checked)

Text label attributes

ElementAttributeRelated method(s)Default value
Text labelandroid:textsetText
getTextnull
Colorandroid:textColorsetTextColor
getTextColors?android:attr/textColorPrimaryDisableOnly
Typographyandroid:textAppearancesetTextAppearance?attr/textAppearanceBodyMedium

Switch states

Switches can be on or off. Switches have enabled, hover, focused, and pressed states.

Display the outer radial reaction only on form factors that use touch, where interaction may obstruct the element completely.

For desktop, the radial reaction isn't needed.

Styles

ElementStyle
Default styleWidget.Material3.CompoundButton.Switch

Default style theme attribute: ?attr/switchStyle

For the full list, see styles and attrs.

<h3 id="theming-switch-deprecated"> Theming switch</h3>

Switch supports the customization of color and typography.

Switch theming example

API and source code:

The following example shows a list of switches with Material theming.

Implementing switch theming

Use theme attributes in res/values/styles.xml, which applies to all switches and affects other components:

xml
<style name="Theme.App" parent="Theme.Material3.*">
    ...
    <item name="colorPrimaryContainer">@color/pink_100</item>
    <item name="colorPrimary">@color/pink_200</item>
</style>

Use default style theme attributes, styles and theme overlays, which apply to all switches but do not affect other components:

xml
<style name="Theme.App" parent="Theme.Material3.*">
    ...
    <item name="switchStyle">@style/Widget.App.Switch</item>
</style>

<style name="Widget.App.Switch" parent="Widget.Material3.CompoundButton.Switch">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Switch</item>
</style>

<style name="ThemeOverlay.App.Switch" parent="">
    <item name="colorPrimaryContainer">@color/pink_100</item>
    <item name="colorPrimary">@color/pink_200</item>
</style>

Use the styles in the layout, which affects only this switch:

xml
<com.google.android.material.switchmaterial.SwitchMaterial
        ...
    style="@style/Widget.App.Switch"
    />
</details>