美文网首页
004-TextInput和ref与android之间的故事 -

004-TextInput和ref与android之间的故事 -

作者: 垒虚 | 来源:发表于2017-10-08 00:33 被阅读0次

一:
前段时间写了一个登录页面,TextInput的组件在android的模拟器上面出现了一系列的问题,今天终于解决了,趁着有记忆的时候记录并分享一下。

二:

1-:可以通过点击事件来获取TextInput的焦点

2-:解决了一个输入问题

三:Coding
1-:首先先写一个TextInput和点击事件组件

const styleChange=(this.state.nameMsg != ''
                ? (styles.textInputMsgChange)
                : (styles.textInputMsg))
        ;
<TouchableOpacity
//点击事件,获取TextInput的焦点
    onPress={()=>this.topChangeFocus()}
    style={styles.topMsgView}>
    <Text style={styles.surNameMsg}>姓</Text>
    <Text style={styles.reputationMsg}>名</Text>
    <Text style={styles.symbolMsg}>:</Text>
    <View style={styles.textInputView}>
        <TextInput
        //用ref来使TextInput获取到焦点
            ref={ (ref)=>this.topTextInput = ref }
            style={styleChange}
            autoCapitalize="none"
            autoCorrect={false}
            keyboardType="twitter"
            placeholder="请输入您的姓名"
            placeholderTextColor='#000000'
            onChangeText={(text)=>{
                this.setState({
                nameMsg:text
                })
            }}/>
    </View>
</TouchableOpacity>

2-:写点击事件的方法

topChangeFocus=()=>{
        if (this.topTextInput !== null) {
            this.topTextInput.focus();
        }
    };

这样就完成用ref来是TextInput在点击事件中获取焦点

接下来就是重点了,前面的代码在ios的模拟器中可以完美的运行,但是到androi的模拟起中就出现严重的问题,第一次对TextInput输入值时并不会显示你输入的值而只是使模拟器判定TextInput中有值

大致情况如下面运行效果

TextInput.gif

现在我们开始修改代码解决这个问题

3-:我们先改变点击事件的代码

topChangeFocus=()=>{
        if (this.topTextInput !== null) {
            this.topTextInput.focus();
            //通过给nameMsg一个null的值来使获取到焦点的时候直接改变状态
            this.setState({
                nameMsg:null
            })
        }
    };

然后我们在TextInput组件中添加点东西

//获得到焦点时回调一个方法,使之间点击TextInput的时候也不会出现上诉的错误
onFocus={()=>this.topOnFocus()}
//失去焦点时回调一个方法,判断nameMsg是否为null,以来改变状态
onBlur={()=>this.topOnBlur()}
//当text为空的时候nameMsg为null
onChangeText={(text)=>{
    this.setState({
    nameMsg:text||null
    })
}}

4-:现在开始我们来写刚刚添加的方法

topOnBlur=()=>{
        if(this.state.nameMsg==null){
            this.setState({
                nameMsg:''
            })
        }
    };
    
topOnFocus=()=>{
        this.setState({
            nameMsg:null
        })
    };

完整的代码

import React, {Component} from 'react';
import {
    StyleSheet,
    Text,
    View,
    Image,
    Dimensions,
    TextInput,
    TouchableOpacity,
    DeviceEventEmitter
} from 'react-native';
const {width,height}=Dimensions.get('window');
export default class NewPage extends Component {
    constructor(props) {
        super(props);
        this.state={
            nameMsg:'',
            IDNumberMsg:''
        };
    };


    topChangeFocus=()=>{
        if (this.topTextInput !== null) {
            this.topTextInput.focus();
            //通过给nameMsg一个null的值来使获取到焦点的时候直接改变状态
            this.setState({
                nameMsg:null
            })
        }
    };


    bottomChangeFocus=()=>{
        if (this.bottomTextInput !== null) {
            this.bottomTextInput.focus();
            this.setState({
                IDNumberMsg:null
            })
        }
    };

    topOnBlur=()=>{
        if(this.state.nameMsg==null){
            this.setState({
                nameMsg:''
            })
        }
    };

    topOnFocus=()=>{
        this.setState({
            nameMsg:null
        })
    };


    bottomOnFocus=()=>{
        this.setState({
            IDNumberMsg:null
        })
    };


    bottomOnBlur=()=>{
        if(this.state.IDNumberMsg==undefined){
            this.setState({
                IDNumberMsg:''
            })
        }
    };

    render() {
        const styleChange=(this.state.nameMsg != ''
                ? (styles.textInputMsgChange)
                : (styles.textInputMsg))
        ;
        return (
            <View style={styles.container}>
                <Image
                style={styles.backgroundImg}
                source={require('./img/beijing.png')}
                />
                <TouchableOpacity
                    //点击事件,获取TextInput的焦点
                    onPress={()=>this.topChangeFocus()}
                    style={styles.topMsgView}>
                    <Text style={styles.surNameMsg}>姓</Text>
                    <Text style={styles.reputationMsg}>名</Text>
                    <Text style={styles.symbolMsg}>:</Text>
                    <View style={styles.textInputView}>
                        <TextInput
                            //用ref来使TextInput获取到焦点
                            ref={ (ref)=>this.topTextInput = ref }
                            style={styleChange}
                            //获得到焦点时回调一个方法,使之间点击TextInput的时候也不会出现上诉的错误
                            onFocus={()=>this.topOnFocus()}
                            //失去焦点时回调一个方法,判断nameMsg是否为null,以来改变状态
                            onBlur={()=>this.topOnBlur()}
                            autoCapitalize="none"
                            autoCorrect={false}
                            keyboardType="twitter"
                            placeholder="请输入您的姓名"
                            placeholderTextColor='#000000'
                            //当text为空的时候nameMsg为null
                            onChangeText={(text)=>{
                                this.setState({
                                nameMsg:text||null
                                })
                            }}/>
                    </View>
                </TouchableOpacity>
                <TouchableOpacity
                    onPress={()=>this.bottomChangeFocus()}
                    style={styles.bottomMsgView}>
                    <Text style={styles.IDNumberMsg}>身份证号</Text>
                    <Text style={styles.bottomSymbolMsg}>:</Text>
                    <View style={styles.textInputView}>
                        <TextInput
                            ref={ (ref)=>this.bottomTextInput = ref }
                            style={this.state.IDNumberMsg!=''
                            ?(styles.textInputMsgChange)
                            :(styles.textInputMsg)}
                            onFocus={()=>this.bottomOnFocus()}
                            onBlur={()=>this.bottomOnBlur()}
                            autoCapitalize="none"
                            autoFocus={this.state.focus}
                            autoCorrect={false}
                            keyboardType="numeric"
                            placeholder="请输入你的身份证号"
                            placeholderTextColor='#000000'
                            onChangeText={(text)=>{
                                this.setState({
                                    IDNumberMsg:text||null
                                })
                            }}/>
                    </View>
                </TouchableOpacity>
                <TouchableOpacity
                    style={styles.btnView}>
                    <Text style={styles.enquiriesMsg}>查询</Text>
                </TouchableOpacity>
                <View style={styles.bottomView}>
                    <Text style={styles.conditionsMsg}>点击"查询"即表示您已同意《平台免费协议与隐私条款》</Text>
                </View>
            </View>
        );
    }
}

四:运行效果

TextInputchange.gif

到这里问题应该就解决了,如果还有什么遗漏的地方希望大神们留言告诉我,我一定第一时间改正。

相关文章

网友评论

      本文标题:004-TextInput和ref与android之间的故事 -

      本文链接:https://www.haomeiwen.com/subject/skwsyxtx.html