Reference version

This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

SegmentedButton

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

Android
Included in Expo Go
Recommended version:
~56.0.20

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).
Single-choice segmented button row with Day, Week, and Month options

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
-