适用于Android的TextInput上的onKeyPress方法

时间:2017-03-30 15:08:50

标签: android react-native textinput onkeypress

我一直试图在/** * Before SharkORM attempts an operation it will ask the * persitable class if it would like to continue with this operation. * * @return BOOL if YES is returned then SharkORM WILL complete the operation * and it is guaranteed to complete. All pre-requisite checks have been made * and the statement compiled before getting to this point. * It is safe to use this method to cascade operations to other classes. * In the case of delete, you might wish to delete related records, or * indeed remove this object from related tables. */ - (BOOL)entityWillDelete; 的{​​{1}}内抓住键盘的事件。

通过阅读组件的文档(https://facebook.github.io/react-native/docs/textinput.html),我注意到TextInput函数完全符合我的需要。但它仅标记为react-native。我没有找到关于onKeyPress解决方法的任何内容,除了此问题(https://github.com/facebook/react-native/issues/1882)已暂停几个月了...

我需要做的是在按下ios时调用特定方法,看起来现在只能对android进行...

你们知道有什么解决办法吗?

提前致谢:)

4 个答案:

答案 0 :(得分:2)

我也遇到过这个问题。我可以告诉你,我做了什么。它不优雅,但它会完成这项工作,直到它也为Android实现。

在Android中,您可以在“活动”中handle key events。此外,您可以send events to JavaScript。这就是你需要的一切。

在js文件中(例如componentDidMount)添加侦听器。

DeviceEventEmitter.addListener('onKeyPressed', yourFunction)

在您的MainActivity中添加类似的内容。

public boolean onKeyUp(int keyCode, KeyEvent event) {
   WritableMap params;
   // params.put something
   // filter only Backspace events if you wish etc.
   reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                           .emit("onKeyPressed", params);
}

每按一次键就会发送一次。不要忘记删除听众(例如componentDidUnmount或任何你不再需要它)。此外,如果您有多个TextInput,请跟踪重点是什么,这样您就不会混淆它。

希望这有帮助。

答案 1 :(得分:2)

Android现在支持

onKeyPress

从版本v0.55.2commit

注意Android上不支持硬件键盘输入,只有软键盘输入。

意思是,如果您在Android模拟器上进行测试并在计算机键盘上键入,则不会处理这些输入。 所以,继续用鼠标按下仿真器上的软键盘。

答案 2 :(得分:1)

将此添加到您的MainActivity.java

import com.facebook.react.modules.core.DeviceEventManagerModule;
import android.view.KeyEvent;

...

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    getReactNativeHost().getReactInstanceManager().getCurrentReactContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("onKeyPressed", keyCode);
    return super.onKeyUp(keyCode, event);
}

现在,这将返回与按下的按钮相对应的keyCode

将此添加到您的组件以侦听发出的keyCode,例如我在componentWillMount

中添加了侦听器
componentWillMount = () => {
    this.keyPressedListener = DeviceEventEmitter.addListener('onKeyPressed', yourFunction);
}

请根据需要处理您的Function,不要忘了之后删除监听器。

答案 3 :(得分:0)

您可以使用TextInput的onChangeText并在提供给onChangeText的函数内部,检查最后输入的文本是否比TextInput中的早期文本少一个字符。如果有,则表示用户按下了退格键,您可以触发/调用您的特定方法。

 class SearchScreenBase extends Component {

  constructor(props) {
    super(props);
    this.state = { lastText: '',
    };
    // Bind callback methods to make `this` the correct context.
    this._onChange = this._onChange.bind(this);
   }
   _onChange(newText) {
      var oldText = this.state.lastText;
      if(newText.length === (oldText.length-1)){
         //INSERT TRIGGER FUNCTION HERE
      }
      this.setState({
               lastText: newText
      });
   }
   render() {
    return (
      <TextInput
        onChangeText = {this._onChange}
        editable = {true}
        maxLength = {40}
      />
    );
  }
}

它很适合我。