反应本机中的TextInput显示具有颜色背景的文本值

Posted

技术标签:

【中文标题】反应本机中的TextInput显示具有颜色背景的文本值【英文标题】:TextInput in react native show text value with a color background 【发布时间】:2019-01-14 17:47:10 【问题描述】:

我正在尝试使用半透明文本输入来制作反应原生的登录屏幕。但是当我在输入中键入文本时出现了一种奇怪的行为:键入的文本看起来像是突出显示的(但不是)。正如您在此屏幕截图中看到的那样:

(好像上传到imgur失败,所以:https://image.ibb.co/hvBDQe/Image_1.jpg)

这是我的代码:

class LoginForm extends Component 

    //#region Constructeurs   
    constructor(props) 
        // Appel du constructeur de Component
        super(props);
        // Initialise les propriétés du composant
        this.state = 
            isLoading: false,
            usernameInput: "",
            passwordInput: "",
            urlInput: "",
            portInput: "443"
        ;
    
    //#endregion

    //#region Cycle de vie du Component
    componentDidMount() 
        
    

    render() 

        return (
            <View style=styles.mainContainer pointerEvents=this.state.isLoading ? 'none' : 'auto'>
                <TextInput style = styles.input 
                            autoCapitalize="none" 
                            onSubmitEditing=() => this.passwordInput.focus() 
                            autoCorrect=false 
                            keyboardType='email-address' 
                            returnKeyType="next" 
                            placeholder='*Email*' 
                            placeholderTextColor=COLOR_GREY_300
                            value=this.state.usernameInput
                            onChangeText=text => this.setState(usernameInput: text)/>
                <TextInput style = styles.input   
                            returnKeyType="go" 
                            ref=(input)=> this.passwordInput = input 
                            onSubmitEditing=() => this.urlInput.focus()
                            placeholder='*Mot de passe*' 
                            returnKeyType="next" 
                            placeholderTextColor=COLOR_GREY_300 
                            secureTextEntry
                            value=this.state.passwordInput
                            onChangeText=text => this.setState(passwordInput: text)/>
                <TextInput style = styles.input 
                            autoCapitalize="none" 
                            onSubmitEditing=() => this.portInput.focus() 
                            ref=(input)=> this.urlInput = input 
                            autoCorrect=false  
                            returnKeyType="next" 
                            placeholder='*adresse url*' 
                            placeholderTextColor=COLOR_GREY_300
                            value=this.state.urlInput
                            onChangeText=text => this.setState(urlInput: text)/>
                <TextInput style = styles.input 
                            autoCapitalize="none" 
                            onSubmitEditing=this._onSubmitLogin 
                            ref=(input)=> this.portInput = input 
                            autoCorrect=false  
                            keyboardType='number-pad' 
                            returnKeyType="go" 
                            placeholder='*port*' 
                            placeholderTextColor=COLOR_GREY_300
                            value=this.state.portInput
                            onChangeText=text => this.setState(portInput: text) />
                <TouchableOpacity style=styles.buttonContainer onPress=this._onSubmitLogin>
                    <Text style=styles.buttonText>*LOGIN*</Text>
                </TouchableOpacity> 
                <ActivityIndicator size="large" color=COLOR_SECONDARY animating=this.state.isLoading style=styles.activityIndicator />
            </View>
        );
    
    //#endregion

    //#region Listener
    _onSubmitLogin = () => 
        // Affichage du loader
        this.setState(
            isLoading: true
        );

        // Récupération de l'API KEY
        let authController = new OBAuthController();
        authController.callPostCreateApiKey().then((apiKey) => 
            
            console.log("apiKey = " + JSON.stringify(apiKey));
            // Masquage du loader
            this.setState(
                isLoading: false
            );
        );
    
    //#endregion


export default LoginForm;

//#region Définition de la StyleSheet   
const styles = StyleSheet.create(
    mainContainer: 
        padding: 50
    ,
    input:
        height: 40,
        backgroundColor: 'rgba(225,225,225,0.3)',
        marginBottom: 16,
        padding: 10,
        color: '#fff'
    ,
    buttonContainer:
        backgroundColor: '#2980b6',
        paddingVertical: 15
    ,
    buttonText:
        color: 'white',
        textAlign: 'center',
        fontWeight: '700'
    ,
    activityIndicator: 
        position:'absolute',
        alignSelf:'center'
    
)
//#endregion

有什么想法吗?谢谢!

【问题讨论】:

尝试去除styles.input的背景色 @Hariks 是的,当我删除此样式道具时,它可以工作。但我想让我的背景半透明...... 将 textInput 包装在 View 中,并为 View 提供所需的背景颜色或为 textInput 提供固定宽度。 @Hariks 它就像一个魅力!谢谢! 【参考方案1】:

在@Hariks 评论之后,我最终将我的每个 TextInput 包装到一个视图中:

<View style=styles.inputView>
                    <TextInput style = styles.input 
                                autoCapitalize="none" 
                                onSubmitEditing=() => this.passwordInput.focus() 
                                autoCorrect=false 
                                keyboardType='email-address' 
                                returnKeyType="next" 
                                placeholder='*Email*' 
                                placeholderTextColor=COLOR_GREY_300
                                value=this.state.usernameInput
                                onChangeText=text => this.setState(usernameInput: text)/>
                </View>
                <View style=styles.inputView>
                    <TextInput style = styles.input   
                                returnKeyType="go" 
                                ref=(input)=> this.passwordInput = input 
                                onSubmitEditing=() => this.urlInput.focus()
                                placeholder='*Mot de passe*' 
                                returnKeyType="next" 
                                placeholderTextColor=COLOR_GREY_300 
                                secureTextEntry
                                value=this.state.passwordInput
                                onChangeText=text => this.setState(passwordInput: text)/>
                </View>
                <View style=styles.inputView>
                    <TextInput style = styles.input 
                                autoCapitalize="none" 
                                onSubmitEditing=() => this.portInput.focus() 
                                ref=(input)=> this.urlInput = input 
                                autoCorrect=false  
                                returnKeyType="next" 
                                placeholder='*adresse url*' 
                                placeholderTextColor=COLOR_GREY_300
                                value=this.state.urlInput
                                onChangeText=text => this.setState(urlInput: text)/>

                </View>
                <View style=styles.inputView>
                    <TextInput style = styles.input 
                                autoCapitalize="none" 
                                onSubmitEditing=this._onSubmitLogin 
                                ref=(input)=> this.portInput = input 
                                autoCorrect=false  
                                keyboardType='number-pad' 
                                returnKeyType="go" 
                                placeholder='*port*' 
                                placeholderTextColor=COLOR_GREY_300
                                value=this.state.portInput
                                onChangeText=text => this.setState(portInput: text) />
                </View>

还有样式:

inputView: 
        height: 40,
        backgroundColor: 'rgba(225,225,225,0.3)',
        marginBottom: 16,
        padding: 10,
    ,
    input:
        color: '#fff'
    ,

【讨论】:

刚刚遇到同样的问题。这个解决方案效果很好!谢谢!

以上是关于反应本机中的TextInput显示具有颜色背景的文本值的主要内容,如果未能解决你的问题,请参考以下文章

反应本机iOS中的TextInput

防止在本机反应中按下 TextInput 时显示系统键盘

如何在TextInput中突出显示部分文本反应原生

如何在本机反应中验证 TextInput 值?

TextInput 中的每次按键后键盘都会关闭本机反应

当在反应本机中输入超过 6 个字符时,如何更改 textInput 文本中的字体大小?