在React Native中自动将焦点转移到下一个TextInput

10

我正在使用React Native开发一个应用程序,其中有三个文本输入框如下所示:

输入图像描述

如果用户插入数字,则需要自动更改文本输入框的焦点。然后,当他/她插入最后一个数字时,应该执行一个函数。

这是我的代码:

  <View style={styles.squareContainer}>
                <View style={styles.square}>
                    <TextInput
                      onChangeText={(oldPassword) => this.setState({oldPassword})}
                      style={{flex:1}}
                      ref="1"
                      keyboardType={'numeric'}
                      style={styles.inputText}
                      maxLength = {1}
                      underlineColorAndroid='rgba(0,0,0,0)'
                      numberOfLines={1}
                      secureTextEntry={true}
                      onSubmitEditing={() => this.focusNextField('2')}


                    />
                </View>
                <View style={styles.square}>
                    <TextInput
                      style={{flex:1}}
                      ref="2"
                      onChangeText={(oldPassword) => this.setState({oldPassword})}
                      keyboardType={'numeric'}
                      maxLength = {1}
                      style={styles.inputText}
                      underlineColorAndroid='rgba(0,0,0,0)'
                      numberOfLines={1}
                      secureTextEntry={true}
                      onSubmitEditing={this.maxLength?1:() => this.focusNextField('3')}


                    />
                </View>
                <View style={styles.square}>
                    <TextInput
                      style={{flex:1}}
                      ref="3"
                      onChangeText={(oldPassword) => this.setState({oldPassword})}
                      returnKeyType='next'
                      keyboardType={'numeric'}
                      style={styles.inputText}
                      underlineColorAndroid='rgba(0,0,0,0)'
                      numberOfLines={1}
                      secureTextEntry={true}


                    />
                </View>
              </View>
换句话说,例如一个用户想要插入153,他/她应该先将1插入到第一个TextInput中,然后光标和焦点应自动替换到下一个TextInput,接着他/她可以插入5并通过移动焦点和光标到第三个TextInput最后插入3。当他插入3时,我需要执行 this.triggerFunction()
我尝试使用以下技巧,但它没有起作用:
onSubmitEditing={this.maxLength?1:() => this.focusNextField('3')}

您能帮我解决这个问题吗?先谢谢了。

3个回答

16

你需要聚焦在想要光标进入的TextInput上。为此,你可以将maxLength设置为1,并调用onChangeText来改变聚焦。同时,你可能还想捕获value并将其存储在状态中。

另外一件事是使用单词或字符作为你的引用对象。数字作为引用可能会有点困惑,例如使用ref={'input_1'}代替ref={'1'}

 <TextInput
    style={{flex:1}}
    ref="input_1"
    keyboardType={'numeric'}
    style={styles.inputText}
    maxLength = {1}
    value={this.state.value}
    underlineColorAndroid='rgba(0,0,0,0)'
    numberOfLines={1}
    secureTextEntry={true}
    onChangeText={value => {
       this.setState({ value })
       if (value) this.refs.input_2.focus(); //assumption is TextInput ref is input_2
    }}
  />

很完美!它能够正常工作了!这是一个聪明而简短的回答。我已经点赞并将其标记为正确答案了!谢谢。 :) - Saeid

1
被回答的问题确实有益,但我的 es-lint 报错说字符串的使用或者 this.refs 已经过时。
所以我这样做了,在构造函数中创建引用(可能这是 React 建议的方式)。在我的情况下,我想要 4 个文本输入框。
constructor(props) {
        super(props)
        this.keyboardHeight = new Animated.Value(0)
        this.num1 = React.createRef()
        this.num2 = React.createRef()
        this.num3 = React.createRef()
        this.num4 = React.createRef()
    }

然后像这样呈现组件。
<View style={styles.inputBoxes}>
                        <TextInput
                            ref={this.num1}
                            style={styles.textInput}
                            onChangeText={number => this.inputNumber(number, 1)}
                            value={this.state.num1}
                            keyboardType="numeric"
                            numberOfLines={1}
                        />
                        <TextInput
                            ref={this.num2}
                            style={styles.textInput}
                            onChangeText={number => this.inputNumber(number, 2)}
                            value={this.state.num2}
                            keyboardType="numeric"
                            numberOfLines={1}
                        />
                        <TextInput
                            ref={this.num3}
                            style={styles.textInput}
                            onChangeText={number => this.inputNumber(number, 3)}
                            value={this.state.num3}
                            keyboardType="numeric"
                            numberOfLines={1}
                        />
                        <TextInput
                            ref={this.num4}
                            style={styles.textInput}
                            onChangeText={number => this.inputNumber(number, 4)}
                            value={this.state.num4}
                            keyboardType="numeric"
                            numberOfLines={1}
                        />
                    </View>

请注意TextInput中的引用。在我的onChange中,我传递了一个标志,告诉它是哪个按钮到this.inputNumber。
这就是我的inputNumber函数的样子。
inputNumber(value, flag) {
    const completeFlag = `num${flag}`
    this.setState({[completeFlag]: value})
    flag = flag + 1
    if (flag < 5 && value) {
        const nextFlag = `num${flag}`
        const textInputToFocus = this[nextFlag]
        textInputToFocus.current.focus()
    }
}

0
对于原生基础,需要进行一些小的更改。 它使用getRef而不是ref。以下代码将在文本更改时切换到下一个输入字段,并在删除输入时恢复到上一个字段。
<Item floatingLabel style={{width:30,borderColor:"black" }}>
    <Input
        style={{flex:1}}
        getRef={input => {this.input_1 = input; }}
    keyboardType={'numeric'}
    maxLength = {1}
    numberOfLines={1}
    onChangeText={value => {
    this.setState({ value })
    if (value) this.input_2._root.focus(); //assumption is next TextInput ref is input_2
    }}
    />
</Item>
<Item floatingLabel style={{width:30}}>
    <Input
        style={{flex:1}}
        getRef={input => {this.input_2 = input; }}
    keyboardType={'numeric'}
    maxLength = {1}
    numberOfLines={1}
    onChangeText={value => {
    this.setState({ value })
    if (value) this.input_3._root.focus(); else this.input_1._root.focus() ; //assumption is next TextInput ref is input_3
    }}
    />
</Item>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接