Comment puis-je mettre une icône dans un TextInput dans React Native?

Je pense avoir quelque chose comme ça https://android-arsenal.com/details/1/3941 où vous avez une icône sur laquelle vous appuyez pour afficher le mot de passe en texte clair, pas en points. Cependant, je n'ai pas pu trouver de composant personnalisé qui m'aiderait.

Je ne veux pas mettre trop de temps sur une fonctionnalité aussi mineure, donc je demande sans avoir encore essayé quoi que ce soit: y a-t-il un composant personnalisé que j'ai manqué? Sinon, existe-t-il un moyen simple d'ajouter des enfants à TextInput? Ou devrais-je simplement avoir TextInput et palpable côte à côte?

21
demandé sur Zygro 2016-12-02 18:13:25

5 réponses

Vous pouvez utiliser la combinaison de View, Icon et TextInput comme ceci:

<View style={styles.searchSection}>
    <Icon style={styles.searchIcon} name="ios-search" size={20} color="#000"/>
    <TextInput
        style={styles.input}
        placeholder="User Nickname"
        onChangeText={(searchString) => {this.setState({searchString})}}
        underlineColorAndroid="transparent"
    />
</View>

Et utilisez flex-direction pour le style

searchSection: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff',
},
searchIcon: {
    padding: 10,
},
input: {
    flex: 1,
    paddingTop: 10,
    paddingRight: 10,
    paddingBottom: 10,
    paddingLeft: 0,
    backgroundColor: '#fff',
    color: '#424242',
},

Icônes ont été prises à partir de "réagir-native-vecteur-icônes"

34
répondu Anton Artemev 2018-04-09 09:05:56

Fondamentalement, vous ne pouvez pas mettre une icône à l'intérieur d'un textInput mais vous pouvez la simuler en l'enveloppant dans une vue et en définissant des règles de style simples.

Voici comment cela fonctionne:

  • mettre les deux Icône et TextInput dans a Vue parent
  • définissez flexDirection du parent sur ' row ' qui alignera le les enfants les uns à côté des autres
  • Donnez TextInput flex 1 afin qu'il prenne toute la largeur du parent Vue
  • donner Vue parent un borderBottomWidth, puis appuyez sur cette frontière vers le bas avec paddingBottom (cela fera apparaître comme un textInput avec un borderBottom)
    • (ou vous pouvez ajouter un autre style en fonction de la façon dont vous voulez qu'il ressemble)

Code:

<View style={styles.passwordContainer}>
  <TextInput
    style={styles.inputStyle}
      autoCorrect={false}
      secureTextEntry
      placeholder="Password"
      value={this.state.password}
      onChangeText={this.onPasswordEntry}
    />
  <Icon
    name='what_ever_icon_you_want'
    color='#000'
    size={14}
  />
</View>

Style:

passwordContainer: {
  flexDirection: 'row',
  borderBottomWidth: 1,
  borderColor: '#000',
  paddingBottom: 10,
},
inputStyle: {
  flex: 1,
},

(Remarque: l'icône est sous le TextInput donc elle apparaît à l'extrême droite, si elle était au-dessus de TextInput apparaît sur la gauche.)

7
répondu linasmnew 2018-04-04 20:59:30

Vous pouvez utiliser ce module qui est facile à utiliser: https://github.com/halilb/react-native-textinput-effects

1
répondu Léo 2016-12-02 15:16:30

, Vous pouvez envelopper votre TextInput dans View.

<View>
  <TextInput/>
  <Icon/>
<View>

Et calculer dynamiquement la largeur, si vous voulez ajouter une icône,

iconWidth = 0.05*viewWidth 
textInputWidth = 0.95*viewWidth

Sinon textInputwWidth = viewWidth.

View et TextInput La couleur d'arrière-plan sont toutes les deux blanches. (Petit hack)

1
répondu Sobol Roman 2018-04-06 18:31:10

Ici vous avez un exemple que j'ai pris de mon propre projet, je viens de supprimer ce que je pensais que nous n'avions pas besoin pour l'exemple.

import React, { Component } from 'react';
import {
  Text,
  TouchableOpacity,
  View,
  StyleSheet,
  Dimensions,
  Image
} from 'react-native';

class YourComponent extends Component {
  constructor(props) {
    super(props);

    this._makeYourEffectHere = this._makeYourEffectHere.bind(this);

    this.state = {
        showPassword: false,
        image: '../statics/showingPassImage.png'
    }
  }

  render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity style={styles.button} onPress={this._makeYourEffectHere}>
          <Text>button</Text>
          <Image style={styles.image} source={require(this.state.image)}></Image>
        </TouchableOpacity>
        <TextInput password={this.state.showPassword} style={styles.input} value="abc" />
      </View>
    );
  }

  _makeYourEffectHere() {
    var png = this.state.showPassword ? '../statics/showingPassImage.png' : '../statics/hidingPassImage.png';
    this.setState({showPassword: !this.state.showPassword, image: png});
  }
}

var styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white',
    justifyContent: 'center',
    flexDirection: 'column',
    alignItems: 'center',
  },
  button: {
    width: Dimensions.get('window').width * 0.94,
    height: 40,
    backgroundColor: '#3b5998',
    marginTop: Dimensions.get('window').width * 0.03,
    justifyContent: 'center',
    borderRadius: Dimensions.get('window').width * 0.012
  },
  image: {
    width: 25,
    height: 25,
    position: 'absolute',
    left: 7,
    bottom: 7
  },
  input: {
    width: Dimensions.get('window').width * 0.94,
    height: 30
  }
});

module.exports = YourComponent;

J'espère que ça vous aidera.

Faites-moi savoir si c'était utile.

0
répondu Facundo La Rocca 2016-12-02 19:05:00