How can I put an icon inside a TextInput in React Native?

前端 未结 9 2087
轻奢々
轻奢々 2020-12-04 19:03

I am thinking of having something like this https://android-arsenal.com/details/1/3941 where you have icon that you press to show password as plaintext, not as dots. However

相关标签:
9条回答
  • 2020-12-04 19:14

    In case is useful I share what I find a clean solution:

    <View style={styles.inputContainer}>
      <TextInput
        style={styles.input}
        onChangeText={(text) => onChange(text)}
        value={value}
      />
      <Icon style={styles.icon} name="your-icon" size={20} />
    </View>
    

    and then in your css

     inputContainer: {
        justifyContent: 'center',
      },
      input: {
        height: 50,
      },
      icon: {
        position: 'absolute',
        right: 10,
      }
    
    0 讨论(0)
  • 2020-12-04 19:16

    You can use combination of View, Icon and TextInput like so:

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

    and use flex-direction for styling

    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',
    },
    

    Icons were taken from "react-native-vector-icons"

    0 讨论(0)
  • 2020-12-04 19:26

    You can use this module which is easy to use: https://github.com/halilb/react-native-textinput-effects

    0 讨论(0)
  • 2020-12-04 19:28

    This is working for me in ReactNative 0.60.4

    View

    <View style={styles.SectionStyle}>
        <Image
            source={require('../assets/images/ico-email.png')} //Change your icon image here
            style={styles.ImageStyle}
        />
    
        <TextInput
            style={{ flex: 1 }}
            placeholder="Enter Your Name Here"
            underlineColorAndroid="transparent"
        />
    </View>
    

    Styles

    SectionStyle: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#fff',
        borderWidth: 0.5,
        borderColor: '#000',
        height: 40,
        borderRadius: 5,
        margin: 10,
    },
    ImageStyle: {
        padding: 10,
        margin: 5,
        height: 25,
        width: 25,
        resizeMode: 'stretch',
        alignItems: 'center',
    }
    
    0 讨论(0)
  • 2020-12-04 19:33

    Here you have an example I took from my own project, i have just removed what i thought we didnt need for the example.

    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;
    

    I hope It helps you.

    Let me know if it was useful.

    0 讨论(0)
  • 2020-12-04 19:35

    you can also do something more specific like that based on Anthony Artemiew's response:

    <View style={globalStyles.searchSection}>
                        <TextInput
                            style={globalStyles.input}
                            placeholder="Rechercher"
                            onChangeText={(searchString) => 
                           {this.setState({searchString})}}
                            underlineColorAndroid="transparent"
                        />
                         <Ionicons onPress={()=>console.log('Recherche en cours...')} style={globalStyles.searchIcon} name="ios-search" size={30} color="#1764A5"/>
    
     </View>
    

    Style:

     searchSection: {
            flexDirection: 'row',
            justifyContent: 'center',
            alignItems: 'center',
            backgroundColor: '#fff',
            borderRadius:50,
            marginLeft:35,
            width:340,
            height:40,
            margin:25
        },
        searchIcon: {
            padding: 10,
        },
        input: {
            flex: 1,
            paddingTop: 10,
            paddingRight: 10,
            paddingBottom: 10,
            paddingLeft: 0,
            marginLeft:10,
            borderTopLeftRadius:50,
            borderBottomLeftRadius:50,
            backgroundColor: '#fff',
            color: '#424242',
        },
    
    0 讨论(0)
提交回复
热议问题