Как обрабатывать кнопку назад, когда TexInput сфокусирован

Это естественный вопрос для Android.

Как я могу обработать кнопку возврата в Android, когда TextInput сфокусирован? BackHandler.addEventListener('hardwareBackPress'. () => {}) не ловит событие, если TextInput сфокусирован. Это автоматически отклоняет клавиатуру.

(На самом деле я пытаюсь добиться удаления курсора, когда нажата кнопка "Назад" и клавиатура закрыта)

Вы можете поиграть с этой выставочной закуской, чтобы понять, о чем я говорю:

3 ответа

Я считаю, что это правильное поведение, но чтобы сделать то, что вы хотите, вы можете обнаружить скрытие клавиатуры, вместо этого с помощью клавиатуры (документы на https://facebook.github.io/react-native/docs/keyboard)

import * as React from 'react';
import { Keyboard } from 'react-native';

class MyComponent extends React.Component {
  componentDidMount() {
      this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this.keyboardDidHide);
  }

  componentWillUnmount() {
    this.keyboardDidHideListener.remove();
  }

  keyboardDidHide = () => {
      this.input.blur();
  };

    //Rest of component...

}

Я предпочитаю этот метод, чем использование события onKeyPress из TextInput, потому что onKeyPress не будет читать аппаратные нажатия на клавиатуре, поэтому, если у пользователя есть устройство с аппаратными кнопками назад, как у некоторых устройств Android, onKeyPress не будет работать, это обеспечивает более последовательный опыт.

Ответ @Danilo работает, но он должен применяться ко всем текстовым вводам. Я закончил тем, что использовал решение Данило с небольшим поворотом.

Keyboard.dismiss() действительно размывает любой активный TextInput, поэтому в случае события keyboardDidHide я просто вызываю Keyboard.dismiss() (хотя клавиатуру просто закрывали нажатием кнопки назад). Мне просто нужно добавить это в мой основной компонент.

import * as React from 'react';
import { Keyboard } from 'react-native';

class MyComponent extends React.Component {
  componentDidMount() {
      this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this.keyboardDidHide);
  }

  componentWillUnmount() {
    this.keyboardDidHideListener.remove();
  }

  keyboardDidHide = () => {
      Keyboard.dismiss();
  };

    //Rest of component...

}

Вы можете проверить это решение в этой закуске.

Если ваше приложение имеет несколько TextInputs, которые onSubmitEditing фокусируют следующий TextInput, вот как я заставил его работать:

  ...

  keyboardDidHide = () => {
      this.keyboardTimeout = setTimeout(() => Keyboard.dismiss(), 300)
  };

  keyboardDidShow = () => {
      clearTimeout(this.keyboardTimeout)
  };

  ...

Вы бы справились с этим на TextInput сам по себе вместо использования BackHandler, Вы можете сделать это через onKeyPress подпирать

constructor(props){
  super(props)
  this.inputRef = React.createRef()
}

<TextInput
  onKeyPress={({ nativeEvent }) => {
    if(nativeEvent.key === 'Backspace'){
      //your code
      // if you want to remove focus then you can use a ref
      Keyboard.dismiss();
      this.inputRef.blur()
    }
  }}
  ref={this.inputRef}
/>

Также важно отметить, что в Android это событие будет запускаться только на программной клавиатуре, поэтому, если вы работаете на эмуляторе и используете клавишу возврата на клавиатуре вашего компьютера, это не будет работать.

Другие вопросы по тегам