react-native-picker-select
react-native-picker-select copied to clipboard
Android: Picker not responding to touch correctly inside Touchable
Describe the bug
Under certain conditions on physical Android devices, tapping on <RNPickerSelect />
does not always trigger the dialog menu to show.
The root cause of this issue appears to be rendering a <Picker />
inside of a <TouchableOpacity />
More info: https://github.com/facebook/react-native/issues/25203
To Reproduce
Steps to reproduce the behavior:
- Render a
<RNPickerSelect />
with children - 'react-native-picker-select' then renders using
renderAndroidHeadless()
- On a physical android device, tap the rendered
<RNPickerSelect />
- Observe if this opens up the picker
- Repeat steps 3 and 4, 20 times
- Observe that the picker has not opened 20 times
Expected behavior
After tapping a <RNPickerSelect />
20 times, the picker should have also opened 20 times.
Screenshots
"n/a".
Additional details
- Device: OnePlus 5T
- OS: Android 9
- react-native-picker-select version: 6.6.0
- react-native version: 0.62.2
- expo sdk version: n/a
Reproduction and/or code sample
https://snack.expo.io/@deansimcox/brave-cashew
Note: Please make sure you run this expo snack on an actual android device, the issue is not present when using the Android view on expo.
I am facing the same issue. Is there any solution of this? It is becoming critical for me, lots of users are complaining about this.
Making this change (https://github.com/lawnstarter/react-native-picker-select/pull/355/commits/331824c577575e70b473c8194f779984c90df742) should fix it, however this would also remove the touchable opacity feedback, so that might not be desirable.
Thanks @deansimcox. It worked 👍
@deansimcox any chance this is related to #237 ?
This is a similar issue with me and 331824c solves it. Any chance this will be solved in upcoming versions?
Should be nice to release a new version with this fix
don't want to make a breaking change quite yet, so fixed with a conditional flag in 8.0.2
worth investigating how the new Pressable
component reacts to this vs the bug found with TouchableOpacity
@lfkwtz Pressable
unfortunately seems to have the same issue.
Showing feedback on press is quite important and we can't even implement our own animation as <Picker>
doesn't provide a callback on open.
fixAndroidTouchableBug={true}
seems to solve this for me.
On android it would intermittently not respond to the user's touch. Originally, I wasn't sure if it was my layout, or I was doing something else to lock the app.
After setting this prop on version 8.0.3, fixAndroidTouchableBug={true}, it is firing consistently. Thank you!!!
For me if I had to choose whether to have feedback or consistently have the dialog come out on press, I choose the dialog.
Is the breaking change only for older versions of the package, older androids, or people expecting a feedback???
Although fixAndroidTouchableBug
fixes the click issue, it disables all onOpen, onClose callbacks. :(
@AVancans Yes. I just faced this issue the same you.
after all this time fixAndroidTouchableBug
fixed this bug for me also 😃
I have the same problem as described above but fixAndroidTouchableBug
doesn't work for me.
Do you have any Idea?
My Component
<View style={styles.card}>
<View style={styles.container}>
<View style={styles.leftView}>
<MyIcon
customIcon={{ name: iconName, bib: iconBib }}
size={25}
color={value ? colors.primary : colors.defaultGrey}
/>
</View>
<View style={layoutStyles.verticalLine}></View>
<View style={styles.rightView}>
<RNPickerSelect
onValueChange={(itemValue) => setValue(itemValue)}
items={data}
placeholder={{ label: placeholder, value: null }}
onOpen={() => {
onPress();
}}
fixAndroidTouchableBug={true}
useNativeAndroidPickerStyle={false}
style={{
placeholder: styles.placeholderStyle,
inputAndroid: styles.input,
inputAndroidContainer: styles.inputContainer,
inputIOS: styles.input,
inputIOSContainer: styles.inputContainer,
}}
/>
</View>
</View>
</View>
My Styles
card: {
...inputStyles.inputContainer,
flexDirection: 'column',
minHeight: dimensions.textfieldHeight,
height: undefined,
maxHeight: dimensions.textfieldHeight * 5,
},
container: {
height: dimensions.textfieldHeight,
alignItems: 'center',
flexDirection: 'row',
},
leftView: {
...inputStyles.leftView,
},
rightView: {
...inputStyles.rightView,
flexDirection: 'row',
justifyContent: 'flex-start',
},
placeholderStyle: {
...inputStyles.normalLabel,
},
inputView: {
width: '100%',
justifyContent: 'center',
},
inputContainer: {
width: '100%',
height: '100%',
justifyContent: 'center',
},
input: {
...textStyles.bodyText,
},

I confirm that adding these 2 lines fixed this issue for me: fixAndroidTouchableBug={true} useNativeAndroidPickerStyle={false}
fixAndroidTouchableBug={true} useNativeAndroidPickerStyle={false}
That worked like a charm for me too. Thanks!
Spent a few hours trying to fix this, please the solution here should be placed in a troubleshooting section on the home page
feel free to open a pr for that @MrShakes