8
votes

Comment définir la zone de saisie de texte au-dessus du clavier tout en entrant le champ de saisie dans React Native

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]


6 commentaires

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" />


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.


11 Réponses :


1
votes

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


1 commentaires

Et qu'en est-il d'iOS?



9
votes

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>;
    }
}


3 commentaires

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.




2
votes

vous pouvez utiliser KeyboardAvoidingView comme suit

if (Platform.OS === 'ios') {
        return <KeyboardAvoidingView behavior="padding">
            {this.renderChatInputSection()}
        </KeyboardAvoidingView>
    } else {
        return this.renderChatInputSection()
    }



0
votes

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!


0 commentaires

0
votes

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;


0 commentaires

2
votes

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();
  };
}, []);


0 commentaires

0
votes

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.


0 commentaires

0
votes

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>


0 commentaires

0
votes

Je sais que cela peut sembler une idée stupide, mais mon problème de clavier a été résolu avec ScrollView. Sans affichage contextuel du clavier

 Sur la vue contextuelle du clavier

<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>


0 commentaires

0
votes

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


0 commentaires