TextInput: read-only text that can't scroll on Android
Issue: On Android, a read-only multiline TextInput does not scroll. If the text is taller than the box, the rest is hidden and the user cannot drag to it. The same code scrolls fine on iOS.
<TextInput
multiline
readOnly
scrollEnabled
value={transcript}
style={{ maxHeight: 150 }}
/>
Fix: a TextInput wrapper
We wrapped TextInput in one small component. When the field is multiline and read-only, it renders a ScrollView with a Text inside, in the same box. Otherwise it renders a normal TextInput.
import React from 'react'
import { ScrollView, StyleSheet, Text, TextInput } from 'react-native'
import type { TextInputProps, TextStyle } from 'react-native'
// Android disables a read-only TextInput, and a disabled view can't scroll.
// So read-only multiline text renders as a ScrollView + Text instead.
export function TextArea(props: TextInputProps) {
const { multiline, readOnly, editable = true, value, style, testID } = props
if (!multiline || (!readOnly && editable)) {
return <TextInput {...props} />
}
const flat: TextStyle = StyleSheet.flatten(style) ?? {}
const {
padding, paddingVertical, paddingHorizontal,
paddingTop, paddingBottom, paddingLeft, paddingRight,
color, fontSize, fontFamily, fontWeight, lineHeight, textAlign,
...boxStyle
} = flat
return (
<ScrollView
testID={testID}
style={boxStyle}
contentContainerStyle={{
padding, paddingVertical, paddingHorizontal,
paddingTop, paddingBottom, paddingLeft, paddingRight,
}}
nestedScrollEnabled
>
<Text selectable style={{ color, fontSize, fontFamily, fontWeight, lineHeight, textAlign }}>
{value}
</Text>
</ScrollView>
)
}
Top comments (0)