Reference version

SegmentedButton

Jetpack Compose Segmented Button components for single or multi-choice selection.

Android
Bundled version:
~55.0.2

Segmented buttons let app users choose from a small set of options displayed side by side in a row. They map to the official Jetpack Compose Segmented Button API.

There are two container types:

  • SingleChoiceSegmentedButtonRow: only one button can be selected at a time (like radio buttons).
  • MultiChoiceSegmentedButtonRow: multiple buttons can be toggled independently (like checkboxes).

Installation

Terminal
npx expo install @expo/ui

If you are installing this in an existing React Native app, make sure to install expo in your project.

Usage

Single-choice segmented button

Use SingleChoiceSegmentedButtonRow when only one option can be active at a time. Each SegmentedButton takes selected and onClick props.

SingleChoiceExample.tsx
import { useState } from 'react'; import { Host, SingleChoiceSegmentedButtonRow, SegmentedButton, Text, } from '@expo/ui/jetpack-compose'; export default function SingleChoiceExample() { const [selectedIndex, setSelectedIndex] = useState(0); const options = ['Day', 'Week', 'Month', 'Year']; return ( <Host matchContents> <SingleChoiceSegmentedButtonRow> {options.map((label, index) => ( <SegmentedButton key={label} selected={index === selectedIndex} onClick={() => setSelectedIndex(index)}> <SegmentedButton.Label> <Text>{label}</Text> </SegmentedButton.Label> </SegmentedButton> ))} </SingleChoiceSegmentedButtonRow> </Host> ); }

Multi-choice segmented button

Use MultiChoiceSegmentedButtonRow when multiple options can be toggled independently. Each SegmentedButton takes checked and onCheckedChange props.

MultiChoiceExample.tsx
import { useState } from 'react'; import { Host, MultiChoiceSegmentedButtonRow, SegmentedButton, Text, } from '@expo/ui/jetpack-compose'; export default function MultiChoiceExample() { const [checkedItems, setCheckedItems] = useState([false, false, false, false]); const options = ['Wi-Fi', 'Bluetooth', 'NFC', 'GPS']; return ( <Host matchContents> <MultiChoiceSegmentedButtonRow> {options.map((label, index) => ( <SegmentedButton key={label} checked={checkedItems[index]} onCheckedChange={checked => { setCheckedItems(prev => { const next = [...prev]; next[index] = checked; return next; }); }}> <SegmentedButton.Label> <Text>{label}</Text> </SegmentedButton.Label> </SegmentedButton> ))} </MultiChoiceSegmentedButtonRow> </Host> ); }

Custom colors

Use the colors prop on SegmentedButton to customize its appearance across active, inactive, and disabled states.

CustomColorsExample.tsx
import { useState } from 'react'; import { Host, SingleChoiceSegmentedButtonRow, SegmentedButton, Text, } from '@expo/ui/jetpack-compose'; export default function CustomColorsExample() { const [selectedIndex, setSelectedIndex] = useState(0); const options = ['$', '$$', '$$$', '$$$$']; return ( <Host matchContents> <SingleChoiceSegmentedButtonRow> {options.map((label, index) => ( <SegmentedButton key={label} selected={index === selectedIndex} onClick={() => setSelectedIndex(index)} colors={{ activeContainerColor: '#6200EE', activeContentColor: '#FFFFFF', }}> <SegmentedButton.Label> <Text>{label}</Text> </SegmentedButton.Label> </SegmentedButton> ))} </SingleChoiceSegmentedButtonRow> </Host> ); }

API

import { SingleChoiceSegmentedButtonRow, MultiChoiceSegmentedButtonRow, SegmentedButton, } from '@expo/ui/jetpack-compose';

Components

MultiChoiceSegmentedButtonRow

Android

Type: React.Element<MultiChoiceSegmentedButtonRowProps>

A row container for multi-choice SegmentedButton children. Maps to Material 3 MultiChoiceSegmentedButtonRow.

MultiChoiceSegmentedButtonRowProps

children

Android
Type: React.ReactNode

SegmentedButton children.

modifiers

Android
Optional • Type: ModifierConfig[]

Modifiers for the component.

SegmentedButton

Android

Type: React.Element<SegmentedButtonProps>

A Material 3 segmented button. Must be used inside a SingleChoiceSegmentedButtonRow or MultiChoiceSegmentedButtonRow.

SegmentedButtonProps

checked

Android
Optional • Type: boolean

Whether the button is currently checked (used inside MultiChoiceSegmentedButtonRow).

children

Android
Optional • Type: React.ReactNode

Children containing a Label slot.

colors

Android
Optional • Type: SegmentedButtonColors

Colors for the button in different states.

enabled

Android
Optional • Type: boolean • Default: true

Whether the button is enabled.

modifiers

Android
Optional • Type: ModifierConfig[]

Modifiers for the component.

onCheckedChange

Android
Optional • Type: (checked: boolean) => void

Callback that is called when the checked state changes (used inside MultiChoiceSegmentedButtonRow).

onClick

Android
Optional • Type: () => void

Callback that is called when the button is clicked (used inside SingleChoiceSegmentedButtonRow).

selected

Android
Optional • Type: boolean

Whether the button is currently selected (used inside SingleChoiceSegmentedButtonRow).

SingleChoiceSegmentedButtonRow

Android

Type: React.Element<SingleChoiceSegmentedButtonRowProps>

A row container for single-choice SegmentedButton children. Maps to Material 3 SingleChoiceSegmentedButtonRow.

SingleChoiceSegmentedButtonRowProps

children

Android
Type: React.ReactNode

SegmentedButton children.

modifiers

Android
Optional • Type: ModifierConfig[]

Modifiers for the component.

Types

SegmentedButtonColors

Android

Colors for the segmented button in different states.

PropertyTypeDescription
activeBorderColor(optional)ColorValue
-
activeContainerColor(optional)ColorValue
-
activeContentColor(optional)ColorValue
-
disabledActiveBorderColor(optional)ColorValue
-
disabledActiveContainerColor(optional)ColorValue
-
disabledActiveContentColor(optional)ColorValue
-
disabledInactiveBorderColor(optional)ColorValue
-
disabledInactiveContainerColor(optional)ColorValue
-
disabledInactiveContentColor(optional)ColorValue
-
inactiveBorderColor(optional)ColorValue
-
inactiveContainerColor(optional)ColorValue
-
inactiveContentColor(optional)ColorValue
-