Skip to main content

Switch, ScrollView and ActivityIndicator Drop Every aria-* Prop

Switch, ScrollView and ActivityIndicator accept all View props in their types and docs, but in React Native 0.88 they pass aria-*, id and tabIndex to the native side unconverted, where nothing reads them. <Switch aria-label="Wi-Fi" /> has no name; accessibilityLabel works.

  • Checked: 22–23 October 2026
  • Versions: React Native 0.88.0
  • Devices: iOS 27.0 Simulator (Accessibility Inspector), Android 17 emulator (uiautomator dump)
  • Upstream: react/react-native#59379: open

How It Was Checked​

Pairs in the reproducer: the left element uses the aria-* prop, the right one its accessibility* form. The accessibility tree was read without a screen reader.

<>
<Switch aria-label="Wi-Fi A" value={on} onValueChange={setOn} />
<Switch accessibilityLabel="Wi-Fi B" value={on} onValueChange={setOn} />
</>

Result​

Pairaria-labelaccessibilityLabel
Switch, Androidcontent-desc="", marked NAF (focusable, but no text or description)content-desc="Wi-Fi B"
Switch, iOSNo labelLabel "Wi-Fi B"
ActivityIndicator, Androidcontent-desc=""content-desc="Loading D"
ScrollView, Androidcontent-desc=""content-desc="Photos F"
  • The cause: View, Text, TextInput and Image convert aria-* to accessibility* in JS. Switch, ScrollView and ActivityIndicator render a native component directly and convert nothing. RefreshControl and Modal do the same (read from the code, not run).
  • On iOS a ScrollView is not an accessibility element, so a label does not apply there; ActivityIndicator on iOS ignores even accessibilityLabel, see a separate note.
  • What works: the accessibility* form of the same prop.

Upstream​