React Native - 设置TextInput游标位置

时间:2015-11-13 05:55:05

标签: android ios react-native

在我的React Native应用程序中,我正在尝试将TextInput的光标位置设置为特定位置(例如,设置为第5个字符),但由于文档缺少一点,我很难这样做。我怀疑它与TextInput的'setSelection'属性有关,但我似乎无法找到该做什么。

有没有人成功这样做过?

感谢。

6 个答案:

答案 0 :(得分:5)

正如@ this.lau_所说,有一个名为selection的控制器属性,它接受一个带有键开始和结束的对象。

示例:

class ControlledSelectionInput extends Component {
    state = {
        selection: {
            start: 0,
            end: 0
        }
    }

    // selection is an object: { start:number, end:number }
    handleSelectionChange = ({ nativeEvent: { selection } }) => this.setState({ selection })

    render() {
        const { selection } = this.state;

        return <TextInput selection={selection} onSelectionChange={this.handleSelectionChange} />
    }
}

您还可以通过获取组件的引用并使用setNativeProps这样编程来设置选择:

this.inputRef.setNativeProps({ selection:{ start:1, end:1 } })

示例:

class SetNativePropsSelectionInput extends Component {
    inputRef = null

    render() {
        const { selection } = this.state;

        return (
            <View>
                <TextInput ref={this.refInput} />
                <Button title="Move selection to start" onPress={this.handleMoveSelectionPress} />
            </View>
    }

    refInput = el => this.inputRef = el

    handleMoveSelectionPress = () => this.input.setNativeProps({
        selection: {
            start: 0,
            end: 0
        }
    })
}

答案 1 :(得分:3)

TextInput上现在有一个selection属性,可用于设置选择或插入/光标位置。

答案 2 :(得分:0)

我只知道原生的方式:

public static void adjustCursor(EditText dgInput) {
    CharSequence text = dgInput.getText();
    if (text instanceof Spannable && text.length() > 0) {
        Spannable spanText = (Spannable) text;
        Selection.setSelection(spanText, text.length());
    }
}

也许你可以在React Native中找到相同的方法。

答案 3 :(得分:0)

我在文档https://facebook.github.io/react-native/docs/textinput.html中看不到任何setSelection属性,我也不相信核心支持此属性。

如果您在Android中执行此操作,我建议您使用Tiny的代码并构建自己的本机组件。 https://facebook.github.io/react-native/docs/native-modules-android.html#content

当然,如果你有技能,你可以在iOS中做同样的事情...... https://facebook.github.io/react-native/docs/native-modules-ios.html#content

答案 4 :(得分:0)

似乎该选择仅在您的文本输入处于焦点状态时有效

您可以执行以下操作使其正常工作

class YourComponent extends React.Component{
      constructor(props) {
       super(props);
       this.state = {
       text:'Hello World',
       selection: {
        start: 0,
        end: 0
       }
  };

this.inputRefs = {};
}

   setSelection = () => {
      this.setState({ select: { start: 1, end: 1 } });
      };

    changeText = (val) => {
     this.inputRefs.input.focus();
    }

    render(){
       return(
          <TextInput 
            onFocus={this.setSelection}
            selection={this.state.setSelection} 
            onChangeText={val => {this.changeText(val)}} 
            value={this.state.text}
             refName={ref => {
             this.inputRefs.input = ref;
             }}
            />
       )
    }
} 

这个想法是,每当您的TextInput调用onChangeText回调通过引用将焦点放在您的TextInput上时,因为您的组件正在响应onFocus回调,我们将在该回调上设置选择

答案 5 :(得分:0)

我想我想要类似的东西。我想在输入处于活动状态时将start重置为0,但仍然允许用户移动光标。我有一个状态变量来跟踪输入何时处于活动状态(“ isActive”),所以我这样做了:

<TextInput selection={this.state.isActive ? undefined : { start: 0 }} />

我使用undefined是因为它是我可以通过选择道具找到的唯一“默认”值。