Скрыть клавиатуру в реагирующем

265

Если я коснусь текстового ввода, я хочу, чтобы можно было нажать в другом месте, чтобы снова отменить клавиатуру (но не ключ возврата). Я не нашел ни малейшей информации об этом во всех учебниках и сообщениях в блоге, которые я читал.

Этот базовый пример по-прежнему не работает для меня с реактивным 0.4.2 в симуляторе. Не удалось попробовать на моем iPhone.

<View style={styles.container}>
    <Text style={styles.welcome}>
      Welcome to React Native!
    </Text>
    <Text style={styles.instructions}>
      To get started, edit index.ios.js
    </Text>
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
    <TextInput
      style={{height: 40, borderColor: 'gray', borderWidth: 1}}
      onEndEditing={this.clearFocus}
    />
  </View>
  • 3
    Попробуйте blur (): github.com/facebook/react-native/issues/113
  • 0
    Правильный ответ должен быть от Эрика Кима ниже. Ответ ScrollView (установите scrollable в false) не идеален, если у вас есть несколько текстовых вводов, он не позволяет переходить от ввода текста к вводу текста без отклонения клавиатуры.
Теги:
react-native

26 ответов

338
Лучший ответ

Проблема с отключением keyboardType='numeric' становится более серьезной, если у вас есть keyboardType='numeric', поскольку нет возможности ее отклонить.

Замена View с помощью ScrollView не является правильным решением, как если бы у вас было несколько textInput или button s, нажав на них, пока клавиатура встала, будет только отбрасывать клавиатуру.

Правильный способ заключается в инкапсуляции View с TouchableWithoutFeedback и вызове Keyboard.dismiss()

EDIT: теперь вы можете использовать ScrollView с keyboardShouldPersistTaps='handled' чтобы только отменить клавиатуру, когда кран не обрабатывается ScrollView (например, нажатие на другие текстовые входы или кнопки)

Если у вас есть

<View style={{flex: 1}}>
    <TextInput keyboardType='numeric'/>
</View>

Измените его на

<ScrollView contentContainerStyle={{flexGrow: 1}}
  keyboardShouldPersistTaps='handled'
>
  <TextInput keyboardType='numeric'/>
</ScrollView>

или же

import {Keyboard} from 'react-native'

<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
    <View style={{flex: 1}}>
        <TextInput keyboardType='numeric'/>
    </View>
</TouchableWithoutFeedback>

EDIT: вы также можете создать компонент более высокого порядка, чтобы закрыть клавиатуру.

import React from 'react';
import { TouchableWithoutFeedback, Keyboard, View } from 'react-native';

const DismissKeyboardHOC = (Comp) => {
  return ({ children, ...props }) => (
    <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
      <Comp {...props}>
        {children}
      </Comp>
    </TouchableWithoutFeedback>
  );
};
const DismissKeyboardView = DismissKeyboardHOC(View)

Просто используйте его так

...
render() {
    <DismissKeyboardView>
        <TextInput keyboardType='numeric'/>
    </DismissKeyboardView>
}

ПРИМЕЧАНИЕ. accessible={false} чтобы форма ввода оставалась доступной через VoiceOver. Люди с ослабленным зрением будут благодарны вам!

  • 5
    Полностью согласен. Это единственный полностью правильный ответ с желаемым поведением. Решение ScrollView не работает, так как вы не можете перейти с одного текстового поля на другое!
  • 21
    Это замечательно, единственный комментарий, который у меня есть, это то, что вы могли бы использовать официальный API-интерфейс Keyboard в RN и вызывать Keyboard.dismiss () вместо вызова некоторой внутренней утилиты RN dismissKeyboard (). Но оба работают нормально в настоящее время.
Показать ещё 13 комментариев
148

Это только что было обновлено и задокументировано ! Нет больше скрытых трюков.

import { Keyboard } from 'react-native'

// Hide that keyboard!
Keyboard.dismiss()

https://github.com/facebook/react-native/pull/9925

  • 2
    Спасибо за добавление этого. Я надеюсь, что ваш ответ всплывает наверх. Я почти пропустил это и использовал устаревшее решение.
  • 2
    Пинг @MrMuetze, чтобы изменить это как правильный ответ
Показать ещё 3 комментария
88

используйте это для таможенного увольнения

var dismissKeyboard = require('dismissKeyboard');

var TestView = React.createClass({
    render: function(){
        return (
            <TouchableWithoutFeedback 
                onPress={dismissKeyboard}>
                <View />
            </TouchableWithoutFeedback>
        )
    }
})
  • 3
    Это работает ... Где это задокументировано?
  • 0
    Это не задокументировано, но образцы в github repo-репозитории используют его несколько раз.
Показать ещё 3 комментария
69

Используйте React Native Keyboard.dismiss()

Обновленный ответ

React Native выставил статический метод dismiss() на Keyboard, поэтому обновленный метод:

import { Keyboard } from 'react-native'; 

Keyboard.dismiss()

Оригинальный ответ

Используйте React Native dismissKeyboard.

У меня была очень похожая проблема, и я чувствовал, что я единственный, кто ее не понял.

ScrollViews

Если у вас есть ScrollView или что-то, что наследуется от него, как ListView, вы можете добавить опору, которая автоматически отключит клавиатуру на основе нажатия или перетаскивания событий.

Подставка является keyboardDismissMode диском и может иметь значение none, interactive или on-drag. Вы можете прочитать больше об этом здесь.

Регулярные виды

Если у вас есть что-то другое, кроме ScrollView и вы хотите, чтобы любые нажатия на клавиатуру ScrollView, вы можете использовать простую TouchableWithoutFeedback и использовать onPress используя React Native library dismissKeyboard чтобы закрыть клавиатуру для вас.

В вашем примере вы можете сделать что-то вроде этого:

var DismissKeyboard = require('dismissKeyboard'); // Require React Native utility library.

// Wrap your view with a TouchableWithoutFeedback component like so.

<View style={styles.container}>

  <TouchableWithoutFeedback onPress={ () => { DismissKeyboard() } }>

    <View>

      <Text style={styles.welcome}>
        Welcome to React Native!
      </Text>

      <Text style={styles.instructions}>
        To get started, edit index.ios.js
      </Text>

      <Text style={styles.instructions}>
        Press Cmd+R to reload,{'\n'}
        Cmd+D or shake for dev menu
      </Text>

      <TextInput style={{height: 40, borderColor: 'gray', borderWidth: 1}} />

    </View>

  </TouchableWithoutFeedback>

</View>

Примечание. TouchableWithoutFeedback может содержать только одного ребенка, поэтому вам нужно обернуть все под ним в одном View как показано выше.

  • 2
    React Native предоставил статический метод dismiss() на клавиатуре, поэтому обновленный метод выглядит так: import { Keyboard } from 'react-native'; Keyboard.dismiss() .
  • 0
    у меня есть клавиатура, которая висит вокруг, так как я сделал перезагрузку, сосредоточившись на поле ввода. в этом случае Keyboard.dismiss() ничего не делает, так как его реализация зависит от фокусировки на вводе, которым я больше не являюсь.
Показать ещё 2 комментария
36

Простым ответом является использование ScrollView вместо View и установка прокручиваемого свойства в false (возможно, потребуется настроить некоторый стиль).

Таким образом, клавиатура увольняется с момента, когда я нахожусь в другом месте. Это может быть проблемой с реакцией-native, но события нажатия только, кажется, обрабатываются с помощью ScrollViews, что приводит к описанному поведению.

Изменить: благодаря jllodra. Обратите внимание, что если вы нажмете прямо в другой Textinput, а затем на улице, клавиатура все равно не скроется.

  • 1
    Он работает с scrollview, но все же есть некоторые случаи, когда я могу нажать кнопку, чтобы изменить вид, используя навигатор, а клавиатура все еще остается внизу и приходится вручную нажимать клавишу возврата, чтобы закрыть ее :(
  • 1
    Клавиатура скрывается, когда вы нажимаете вне TextInput, но если (вместо нажатия снаружи) вы нажимаете на другой TextInput и, наконец, нажимаете снаружи, клавиатура не скрывается. Проверено на 0.6.0.
Показать ещё 3 комментария
25

Я новичок в React, и столкнулся с одной и той же проблемой при создании демонстрационного приложения. Если вы используете onStartShouldSetResponder (описанную здесь), вы можете получить штрихи на простой старый React.View. Любопытно услышать мысли более опытных Реагентов по этой стратегии/если там лучший, но это то, что сработало для меня:

containerTouched(event) {
  this.refs.textInput.blur();
  return false;
}

render() {
  <View onStartShouldSetResponder={this.containerTouched.bind(this)}>
    <TextInput ref='textInput' />
  </View>
}

Здесь есть две вещи. Во-первых, как обсуждалось здесь, еще нет способа закончить редактирование всех подзонов, поэтому мы должны обращаться к TextInput напрямую, чтобы размыть его. Во-вторых, onStartShouldSetResponder перехватывается другими сенсорными элементами управления поверх него. Таким образом, нажатие на TouchableHighlight т.д. (Включая другой TextInput) в представлении контейнера не вызовет событие. Однако нажатие на Image в представлении контейнера по-прежнему будет отклонять клавиатуру.

  • 0
    Это определенно работает. Но, как вы сказали, мне тоже интересно, если это правильный путь. Надеюсь, что они скоро это решат ( github.com/facebook/react-native/issues/113 )
  • 1
    Это единственное решение, которое сработало для меня! Спасибо!
Показать ещё 1 комментарий
21

Вы можете импортировать keyboard из адаптивной, как показано ниже:

import { Keyboard } from 'react-native';

и в вашем коде сделать что-то вроде этого:

render() {
    return (
      <TextInput
        onSubmit={Keyboard.dismiss}
      />
    );
  }

статический увольнение()

Отключает активную клавиатуру и удаляет фокус.

  • 3
    onSubmitEditing={Keyboard.dismiss} работать на меня
  • 0
    Мне не нужно static dismiss() . Я просто добавил Keyboard.dismiss() в мой метод onSubmit (где onSubmitEditing={() => {this.onSubmit()}})
16

Используйте ScrollView вместо View и установите для атрибута keyboardShouldPersistTaps значение false.

<ScrollView style={styles.container} keyboardShouldPersistTaps={false}>
    <TextInput
        placeholder="Post Title"
        onChange={(event) => this.updateTitle(event.nativeEvent.text)}
        style={styles.default}/>
 </ScrollView>
  • 0
    Согласно документации, атрибут keyboardShouldPersistTaps умолчанию имеет значение false при использовании ScrollView . Я только что обновил свою реактивную версию до последней версии, и проблема с переключением на второй TextInput прежнему сохраняется. Клавиатура тогда не запрещена. Вы нашли решение для этой конкретной проблемы?
  • 1
    Документы были неверными, но теперь были обновлены, см. Этот PR: github.com/facebook/react-native/issues/2150
Показать ещё 2 комментария
9

Если кому-то нужен рабочий пример того, как уволить многострочный ввод текста здесь, иди! Надеюсь, что это поможет некоторым людям, документы не описывают способ вообще отказаться от многострочного ввода, по крайней мере, не было конкретной ссылки на то, как это сделать. Тем не менее, noob на самом деле размещает здесь в стеке, если кто-то думает, что это должно быть ссылкой на фактическую запись, которую этот фрагмент был написан для дайте мне знать.

import React, { Component } from 'react'
import {
  Keyboard,
  TextInput,
  TouchableOpacity,
  View,
  KeyboardAvoidingView,
} from 'react-native'

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      behavior: 'position',
    }
    this._keyboardDismiss = this._keyboardDismiss.bind(this)
  }

  componentWillMount() {
    this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide);
  }

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

  _keyboardDidHide() {
    Keyboard.dismiss()
  }

  render() {
    return (
      <KeyboardAvoidingView
        style={{ flex: 1 }}
        behavior={this.state.behavior}
      >
        <TouchableOpacity onPress={this._keyboardDidHide}>
          <View>
            <TextInput
              style={{
                color: '#000000',
                paddingLeft: 15,
                paddingTop: 10,
                fontSize: 18,
              }}
              multiline={true}
              textStyle={{ fontSize: '20', fontFamily: 'Montserrat-Medium' }}
              placeholder="Share your Success..."
              value={this.state.text}
              underlineColorAndroid="transparent"
              returnKeyType={'default'}
            />
          </View>
        </TouchableOpacity>
      </KeyboardAvoidingView>
    )
  }
}
  • 0
    Спасибо за исправление форматирования Kamil Sarna!
8
const dismissKeyboard = require('dismissKeyboard');
dismissKeyboard(); //dismisses it

Подход № 2;

Благодаря пользователю @ricardo-stuven, чтобы указать на это, есть еще один лучший способ убрать клавиатуру, которую вы можете увидеть в примере в интерактивных документах.

Простая импортная Keyboard и вызов метода dismiss()

  • 1
    Это точный эквивалент Keyboard.dismiss, который является предпочтительным, поскольку задокументирован. github.com/facebook/react-native/blob/...
  • 0
    В то время, когда я давал этот ответ, это не было задокументировано. Спасибо за упоминание этого. Я обновлю свой ответ.
7

Обновлено использование ScrollView для React Native 0.39

<ScrollView scrollEnabled={false} contentContainerStyle={{flex: 1}} />

Хотя проблема с двумя блоками TextInput остается проблемой. например. Форма имени пользователя и пароля теперь будет отключать клавиатуру при переключении между входами. Хотелось бы получить некоторые предложения по сохранению клавиатуры при переключении между TextInputs при использовании ScrollView.

  • 3
    Похоже, что 0.40 обновляет keyboardShouldPersistTaps из boolean в enum с возможным значением 'handled', которое должно это исправить.
5

Я только что проверил это, используя последнюю версию React Native (0.4.2), и клавиатура отклоняется при нажатии в другом месте.

И FYI: вы можете установить функцию обратного вызова, которая будет выполняться, когда вы отпустите клавиатуру, назначив ее опоре "onEndEditing".

  • 0
    Я отлаживал обратный вызов onEndEditing, но он никогда не срабатывал раньше; Я собираюсь разобраться в этом с новой версией реагировать родной, спасибо за ваше предложение
  • 0
    Я обновил свой ответ. Этот базовый пример все еще не работает для меня. У вас есть другая подсказка или идея?
5

Если я не ошибаюсь, последняя версия React Native решила эту проблему, чтобы убрать клавиатуру, нажав.

  • 4
    Вы могли бы указать, какая часть их кода / документа делает это? Я сталкиваюсь с той же самой проблемой, и я действительно ценю это, указывающее мне направление :)
  • 0
    Было бы интересно это тоже :)
Показать ещё 2 комментария
5

Как насчет размещения сенсорного компонента вокруг/рядом с TextInput?

var INPUTREF = 'MyTextInput';

class TestKb extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <View style={{ flex: 1, flexDirection: 'column', backgroundColor: 'blue' }}>
                <View>
                    <TextInput ref={'MyTextInput'}
                        style={{
                            height: 40,
                            borderWidth: 1,
                            backgroundColor: 'grey'
                        }} ></TextInput>
                </View>
                <TouchableWithoutFeedback onPress={() => this.refs[INPUTREF].blur()}>
                    <View 
                        style={{ 
                            flex: 1, 
                            flexDirection: 'column', 
                            backgroundColor: 'green' 
                        }} 
                    />
                </TouchableWithoutFeedback>
            </View>
        )
    }
}
3

Оборачивание ваших компонентов в TouchableWithoutFeedback может вызвать странное поведение прокрутки и другие проблемы. Я предпочитаю оборачивать мое верхнее приложение в View с onStartShouldSetResponder свойством onStartShouldSetResponder. Это позволит мне обрабатывать все необработанные касания и затем отклонять клавиатуру. Важно отметить, что поскольку функция-обработчик возвращает false, событие касания распространяется как обычно.

 handleUnhandledTouches(){
   Keyboard.dismiss
   return false;
 }

 render(){
    <View style={{ flex: 1 }} onStartShouldSetResponder={this.handleUnhandledTouches}>
       <MyApp>
    </View>
  }
3

https://facebook.github.io/react-native/docs/keyboard.html

Используйте

Keyboard.dismiss(0);

чтобы скрыть клавиатуру.

2

Используя keyboardShouldPersistTaps в ScrollView, вы можете перейти в "обработанный", в котором рассматриваются проблемы, которые люди говорят, используя ScrollView. Вот что говорит документация об использовании "обработано": the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor). Здесь находится ссылка на него.

  • 0
    Это сработало для меня! (однако мне пришлось добавить его в мою стороннюю библиотеку react-native-keyboard-aware-scroll-view ).
1

Есть много способов справиться с этим, ответы выше не включают returnType как он не был включен в returnType -native в то время.

1: Вы можете решить эту проблему, обернув свои компоненты внутри ScrollView, по умолчанию ScrollView закрывает клавиатуру, если мы что-то нажимаем. Но если вы хотите использовать ScrollView, но отключите этот эффект. Вы можете использовать pointerEvent prop для scrollView pointerEvents = 'none'.

2: если вы хотите закрыть клавиатуру нажатием кнопки, вы можете просто использовать Keyboard с react-native

import { Keyboard } from 'react-native' and inside onPress of that button, you can use Keyboard.dismiss()'.

3: Вы также можете закрыть клавиатуру, когда нажмете клавишу возврата на клавиатуре. ПРИМЕЧАНИЕ: если у вас тип клавиатуры цифровой, у вас не будет клавиши возврата. Таким образом, вы можете включить его, предоставив ему реквизит, returnKeyType to done. или вы можете использовать onSubmitEditing={Keyboard.dismiss}, он onSubmitEditing={Keyboard.dismiss} всякий раз, когда мы нажимаем клавишу возврата. И если вы хотите отклонить клавиатуру при потере фокуса, вы можете использовать onBlur prop, onBlur = {Keyboard.dismiss}

1

Первая импортная клавиатура

import { Keyboard } from 'react-native'

Затем внутри вашего TextInput вы добавляете Keyboard.dismiss в реквизит onSubmitEditing. У вас должно быть что-то похожее на это:

render(){
  return(
    <View>
      <TextInput 
        onSubmitEditing={Keyboard.dismiss}
       />
    </View>
  )  
}
1

в использовании ScrollView

keyboardShouldPersistTaps="handled" 

Это сделает вашу работу.

1
import { Keyboard } from 'react-native';
Keyboard.dismiss();`

или

onSubmitEditing={Keyboard.dismiss}

0

Keyboard.dismiss() сделает это. Но иногда это может потерять фокус, и Keyboard не сможет найти ссылку. Самый последовательный способ - поставить ref=_ref в textInput и сделать _ref.blur() когда вам нужно уволить, и _ref.focus() когда вам нужно вернуть клавиатуру.

0

сделайте это - он скроет мягкую клавиатуру.

Step1 импортируйте клавиатуру внутри вашего .js файла.

import {Keyboard} из 'response-native';

Step2 и где бы вы ни скрывали клавиатуру, просто используйте эту строку ниже.

Keyboard.dismiss();

0

Использовать модуль клавиатуры

import { Keyboard } from 'react-native';

Keyboard.dismiss(); 

(or)

onSubmitEditing={Keyboard.dismiss}
0

импортировать "клавиатуру" из реакции-native в ваш компонент

запустить keyboard.dismiss(); для скрытия клавиатуры

0

Проблема с отключением клавиатуры становится более серьезной, если у вас есть keyboardType='numeric', поскольку нет возможности ее отклонить.

Замена View на ScrollView не является правильным решением, как если бы у вас было несколько текстовых входов или кнопок; нажимая на них, пока клавиатура вверх, будет только отбрасывать клавиатуру.

Правильный способ заключается в инкапсуляции View с помощью TouchableWithoutFeedback и вызова. Здесь KeyBoard - класс react-native.

Функция

Keyboard.dismiss используется для отклонения события клавиатуры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню