J'utilise le composant TextInput natif de réaction. Ici, je dois afficher la InputBox au-dessus du clavier si l'utilisateur clique sur le champ textInput.
J'ai essayé ci-dessous mais je suis confronté à des problèmes
1. Clavier évitant la vue
<SafeAreaView> <KeyboardAvoidingView> <ScrollView> <Text>Name</Text> <AutoTags //required suggestions={this.state.suggestedName} handleAddition={this.handleAddition} handleDelete={this.handleDelete} multiline={true} placeholder="TYPE IN" blurOnSubmit={true} style= {styles.style} /> </ScrollView> </KeyboardAvoidingView> </SafeAreaView>
2. react-native-Keyboard-aware-scroll-view
a.It shows some empty space below the input box b.ScrollView is reset to the top of the page after I moving to the next input box
Ici, j'ai défini le Keyboard-aware-scroll-view dans le composant ScrollView
Veuillez clarifier
Mon exemple de code est
a. Here it shows some empty space below the input box b. Manually I need to scroll up the screen to see the input field which I was given in the text field c. Input box section is hiding while placing the mouse inside the input box
[ https://github.com/APSL/react-native-keyboard-aware-scroll-view]
11 Réponses :
Pour Android, vous pouvez définir android: windowSoftInputMode = "AdjustResize"
pour Activité
dans le fichier AndroidManifest
, ainsi lorsque le clavier s'affiche, votre écran se redimensionnera et si vous mettez le TextInput
au bas de votre écran, il sera conservé au-dessus du clavier
Et qu'en est-il d'iOS?
Donnez une position à votre TextInput: style absolu et changez sa position en utilisant la hauteur renvoyée par les événements keyboardDidShow et keyboardDidHide.
Voici une modification de l'exemple de clavier de la documentation de React Native pour démonstration:
import React, { Component } from 'react'; import { Keyboard, TextInput } from 'react-native'; class Example extends Component { state = { keyboardOffset: 0, }; componentDidMount() { this.keyboardDidShowListener = Keyboard.addListener( 'keyboardDidShow', this._keyboardDidShow, ); this.keyboardDidHideListener = Keyboard.addListener( 'keyboardDidHide', this._keyboardDidHide, ); } componentWillUnmount() { this.keyboardDidShowListener.remove(); this.keyboardDidHideListener.remove(); } _keyboardDidShow(event) { this.setState({ keyboardOffset: event.endCoordinates.height, }) } _keyboardDidHide() { this.setState({ keyboardOffset: 0, }) } render() { return <View style={{flex: 1}}> <TextInput style={{ position: 'absolute', width: '100%', bottom: this.state.keyboardOffset, }} onSubmitEditing={Keyboard.dismiss} /> </View>; } }
J'ai essayé avec ça. Mais cela n'a pas fonctionné comme prévu dans AutoTags
Bonjour, j'essaye le code ci-dessus, mais j'ai remarqué que le contenu de la page, qui dans mon cas est une FlatList
saute à cause du bottom: this.state.keyboardOffset
. De plus, il semble que event.endCoordinates.height
renvoie une valeur plus élevée que le clavier, car il y a un écart entre le TextInput
et le Keyboard
.
Les éléments positionnés «absolus» @Yasir sont relatifs à leur vue contenant, qui peut différer en taille de l'appareil. Si votre TextInput se trouve à l'intérieur d'un conteneur plus petit que la hauteur de l'appareil, vous devez tenir compte de la différence de hauteur entre le conteneur et l'appareil. Voici une formule qui a fonctionné pour moi pour positionner une vue "Texte" directement au-dessus du clavier: bottom: keyboardHeight - ((deviceHeight - containerHeight) / 2)
. J'ai une barre supérieure et inférieure, avec ma vue Texte dans un conteneur entre, donc j'ai pris en compte la différence entre la hauteur de l'appareil et mon conteneur.
react-native-keyboard-aware-scroll-view a causé un problème similaire dans iOS. C'est là que je suis tombé sur react-native-keyboard-aware-view a>. Les extraits sont à peu près les mêmes. J'espère que ça marche <KeyboardAwareView animated={true}>
<View style={{flex: 1}}>
<ScrollView style={{flex: 1}}>
<Text style={{fontSize: 20, color: '#FFFFFF'}}>A</Text>
<Text style={{fontSize: 20, color: '#FFFFFF'}}>B</Text>
<Text style={{fontSize: 20, color: '#FFFFFF'}}>C</Text>
<Text style={{fontSize: 20, color: '#FFFFFF'}}>D</Text>
</ScrollView>
</View>
<TouchableOpacity style={{height: 50, backgroundColor: 'transparent', alignItems: 'center', justifyContent: 'center', alignSelf: 'stretch'}}>
<Text style={{fontSize: 20, color: '#FFFFFF'}}>Submit</Text>
</TouchableOpacity>
</KeyboardAwareView>
Ici, ce n'est pas du texte. Zone TextInput qui rend les autoTags natifs de réaction
vous pouvez utiliser KeyboardAvoidingView comme suit
if (Platform.OS === 'ios') { return <KeyboardAvoidingView behavior="padding"> {this.renderChatInputSection()} </KeyboardAvoidingView> } else { return this.renderChatInputSection() }
Je vais essayer ceci et vous faire savoir
Essayez ceci react-native-keyboard-aware-scroll-view < / a> et supprimez ScrollView
Il affichera un espace sous la zone de saisie après avoir entré les entrées
Vous trouverez certainement cela utile de
Problème Android avec affichage de défilement compatible avec le clavier
Je ne sais vraiment pas pourquoi vous devez ajouter
"androidStatusBar": { "backgroundColor": "# 000000" }
pour que KeyboardawareScrollview fonctionne
<₹ Remarque : n'oubliez pas de redémarrer le projet sans la dernière étape, cela risque de ne pas fonctionner profitez-en!
J'ai rencontré le même problème lorsque je travaillais sur mon projet parallèle, et je l'ai résolu après avoir quelque peu peaufiné KeyboardAvoidingView. J'ai publié ma solution sur npm, veuillez essayer et donner moi un retour! Démo sur iOS
Exemple d'extrait de code
p >
import React from 'react'; import { StyleSheet, TextInput } from 'react-native'; import KeyboardStickyView from 'rn-keyboard-sticky-view'; const KeyboardInput = (props) => { const [value, setValue] = React.useState(''); return ( <KeyboardStickyView style={styles.keyboardView}> <TextInput value={value} onChangeText={setValue} onSubmitEditing={() => alert(value)} placeholder="Write something..." style={styles.input} /> </KeyboardStickyView> ); } const styles = StyleSheet.create({ keyboardView: { ... }, input: { ... } }); export default KeyboardInput;
Version Hooks:
const [keyboardOffset, setKeyboardOffset] = useState(0); const onKeyboardShow = event => setKeyboardOffset(event.endCoordinates.height); const onKeyboardHide = () => setKeyboardOffset(0); const keyboardDidShowListener = useRef(); const keyboardDidHideListener = useRef(); useEffect(() => { keyboardDidShowListener.current = Keyboard.addListener('keyboardWillShow', onKeyboardShow); keyboardDidHideListener.current = Keyboard.addListener('keyboardWillHide', onKeyboardHide); return () => { keyboardDidShowListener.current.remove(); keyboardDidHideListener.current.remove(); }; }, []);
J'ai basé ma solution de la solution @basbase.
Mon problème avec sa solution qui fait que le TextInput saute sans aucun égard pour ma vue globale.
Ce n'était pas ce que je voulais mon cas, j'ai donc fait ce qu'il avait suggéré mais avec une petite modification
Donnez simplement le style de vue parent comme ceci:
<View style={{ flex: 1, bottom: keyboardOffset, }}>
Et cela fonctionnerait! le seul problème est que si le clavier est ouvert et que vous faites défiler vers le bas, vous verrez le remplissage vierge supplémentaire à la fin de l'écran.
Le meilleur et le plus simple est d'utiliser la vue par défilement, cela prendra automatiquement le contenu vers le haut et TextInput ne sera pas masqué, peut se référer au code ci-dessous
<ScrollView style={styles.container}> <View> <View style={styles.commonView}> <Image source={firstNameIcon} style={{width: 25, height: 25}}></Image> <Text style={styles.commonTxt}>First Name</Text> </View> <TextInput onFocus={() => onFocus('firstName')} placeholder="First Name" style={styles.txtInput} onChangeText={(text) => onChangeText(text, 'firstName')} value={firstNameValue} /> </View> <View> <View style={styles.commonView}> <Image source={LastNameIcon} style={{width: 25, height: 25}}></Image> <Text style={styles.commonTxt}>Last Name</Text> </View> <TextInput onFocus={() => onFocus('lastName')} placeholder="Last Name" style={styles.txtInput} onChangeText={(text) => onChangeText(text, 'lastName')} value={lastNameValue} /> </View> <View> <View style={styles.commonView}> <Image source={callIcon} style={{width: 25, height: 25}}></Image> <Text style={styles.commonTxt}>Number</Text> </View> <TextInput onFocus={() => onFocus('number')} placeholder="Number" style={styles.txtInput} onChangeText={(text) => onChangeText(text, 'number')} value={numberValue} /> </View> <View> <View style={styles.commonView}> <Image source={emailIcon} style={{width: 25, height: 25}}></Image> <Text style={styles.commonTxt}>Email</Text> </View> <TextInput onFocus={() => onFocus('email')} placeholder="Email" style={styles.txtInput} onChangeText={(text) => onChangeText(text, 'email')} value={emailValue} /> </View> <View style={styles.viewSavebtn}> <TouchableOpacity style={styles.btn}> <Text style={styles.saveTxt}>Save</Text> </TouchableOpacity> </View> </ScrollView>
Je sais que cela peut sembler une idée stupide, mais mon problème de clavier a été résolu avec ScrollView.
<View style={{flex:1, height:"100%"}}> <ScrollView showsVerticalScrollIndicator={false}> <Text>Username</Text> <TextInput style={styles.TextInput} underlineColorAndroid="transparent" autoCapitalize="none" type="email" value={userName} onChangeText={(userName) => this.setState({ userName })} /> <Text style={styles.textInputHeader}>Password</Text> <TextInput style={styles.TextInput} secureTextEntry={true} underlineColorAndroid="transparent" autoCapitalize="none" value={password} onChangeText={(password) => this.setState({ password })} /> <TouchableOpacity> <Text> Forgot Password? </Text> </TouchableOpacity> <TouchableOpacity onPress={this.checkInput}> <Text>LOGIN</Text> </TouchableOpacity> <Text onPress={() => this.props.navigation.navigate("SignupScreen")}>Don't have an account? Sign up</Text> </ScrollView> </View> </View>
allez dans votre application Android> src> main> AndroidManifest.xml écrivez ces 2 lignes:
android: launchMode = "singleTop" android: windowSoftInputMode = "AdjustPan"
entrez la description de l'image ici
essayez de définir le comportement de KeyboardAvoidingView et assurez-vous que le style de vue de votre conteneur est flex
J'ai défini behavior = 'padding' style = {{flex: 1}} pour KeyboardAvoidingView. NAME placeholder = "TYPE IN" /> View >
J'ai besoin de ce comportement similaire dans React native. Lors du passage à la zone de saisie de texte, le clavier s'est ouvert et fermé après le retour. github.com/Just-/UIViewController- KeyboardAnimation
pouvez-vous essayer de retirer les balises
et d'en placer une seule en dehors de
?Je ne sais pas pourquoi vous avez annulé mes modifications. cela aiderait certainement si vous pouviez placer le code dans votre description du problème.
@kenmistry J'ai ajouté mon exemple de code. Il n'affichera pas la zone inputText au-dessus du clavier. Je veux faire défiler vers le haut pour voir quelle entrée je donne dans la zone de texte. Les étiquettes automatiques ont les mêmes propriétés que la zone TextInput.