Sono in esecuzione reagire nativo 0.24.1 e sto riscontrando un problema con il componente <TouchableOpacity>
quando si trova all'interno di un <ScrollView>
.React Native: TouchableOpacity onPress problemi all'interno di ScrollView
I suoi onPress eventi vanno bene ma c'è un caso speciale quando non lo fanno. Se con il componente <TouchableOpacity>
si dispone di un <TextInput>
e lo stato attivo si trova sulla casella <TextInput>
, è possibile fare clic su <TouchableOpacity>
e vedrete l'evento onPress NON verrà attivato.
Almeno la prima volta che lo fai. Una volta che lo stato attivo NON è più nello <TextInput>
, è ora possibile premere sul componente <TouchableOpacity>
e l'evento onPress verrà attivato correttamente.
Si noti che se il componente <TouchableOpacity>
è inserito all'interno di <View>
anziché <ScrollView>
, tutto funziona come previsto e il problema precedente non si applica.
Ecco il codice per dimostrare il problema:
const React = require('react-native');
const {
Component,
Dimensions,
View,
ScrollView,
Text,
TextInput,
TouchableOpacity,
} = React;
// ----------------------------------------------------------------------------
class TouchableOpacityTest extends Component {
constructor(props, context) {
super(props, context);
this.state = {count_onPress:0,count_onPressIn:0,count_onPressOut:0,count_onLongPress:0};
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
onPressEvent(what,e) {
console.log('what:',what);
let newState = {};
newState['count_'+what] = ++this.state['count_'+what];
this.setState(newState);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
render() {
let touchableProps = {
onPress: this.onPressEvent.bind(this,'onPress'),
onPressIn: this.onPressEvent.bind(this,'onPressIn'),
onPressOut: this.onPressEvent.bind(this,'onPressOut'),
onLongPress: this.onPressEvent.bind(this,'onLongPress'),
}
return (
<View style={{flex:1,flexDirection:'column',justifyContent:'flex-start',alignItems:'center',backgroundColor:'blue'}} >
<ScrollView style={{width:Dimensions.get('window').width*0.9,backgroundColor:'red'}}>
<TextInput style={{backgroundColor:'rgb(200,200,200)',marginTop:14}}
placeholder="Focus on me,hide keyboard,and click on text below"
autoCorrect={false}
/>
<TouchableOpacity {...touchableProps} >
<Text style={{fontSize:20,backgroundColor:'pink',marginTop:14}}>
Click on me!{"\n"}
onPress:{this.state.count_onPress}{"\n"}
onPressIn:{this.state.count_onPressIn}{"\n"}
onPressOut:{this.state.count_onPressOut}{"\n"}
onLongPress:{this.state.count_onLongPress}{"\n"}
</Text>
</TouchableOpacity>
</ScrollView>
</View>
);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
// ----------------------------------------------------------------------------
AppRegistry.registerComponent('react_native_app1',() => TouchableOpacityTest);
si può rimpiazzare il <ScrollView>
con un componente <View>
sul codice di cui sopra e vedrete che onPress generato l'evento ogni volta, anche quando la messa a fuoco è sul <TextView>
NOTA: sto lavorando su Android. Non ho idea se questo accade anche su iOS.
NOTA 2: Secondo Aakash Sigdel, questo è davvero accadendo su iOS troppo.
provare a utilizzare uno di keyboardDismissMode = {'none', 'ondrag', 'interactive'} – Mihir
L'ho verificato su iOS e posso confermare che ciò si verifica anche in iOS. –
Ho riscontrato un problema simile con accanto a ScrollView, ma il problema non è stato risolto durante la rimozione di ScrollView. Invece, ho aumentato la dimensione del mio pulsante alla dimensione minima raccomandata di 44x44. Successivamente, il pulsante ha riconosciuto tutti gli eventi tap. –