Скрыть клавиатуру в react-native
Если я нажму на textinput, я хочу иметь возможность нажать где-нибудь еще, чтобы снова закрыть клавиатуру (но не клавишу возврата). Я не нашел ни малейшей информации об этом во всех учебниках и блогах, которые я читал.
этот базовый пример все еще не работает для меня с react-native 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>
19 ответов:
проблема с клавиатурой не увольнение становится более серьезным, если у вас есть
keyboardType='numeric', так как нет никакого способа, чтобы уволить его.замена вида на ScrollView не является правильным решением, как если бы у вас было несколько
textInputилиbuttons, нажав на них, пока клавиатура вверх будет только уволить клавиатуру.правильный способ-инкапсулировать представление с помощью
TouchableWithoutFeedback, а вызовKeyboard.dismiss()изменить: теперь вы можете использовать
ScrollViewСkeyboardShouldPersistTaps='handled'только уволить клавиатура, когда кран не обрабатывается детьми (т. е. нажатие на другие textInputs или кнопки)если у вас
<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>изменить: вы также можете создать компонент более высокого порядка, чтобы закрыть клавиатуру.
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. Слабовидящие люди будут вам благодарны!
Это просто обновляется!--2-->и документально! Больше никаких скрытых трюков.
import { Keyboard } from 'react-native' // Hide that keyboard! Keyboard.dismiss()
используйте это для пользовательского увольнения
var dismissKeyboard = require('dismissKeyboard'); var TestView = React.createClass({ render: function(){ return ( <TouchableWithoutFeedback onPress={dismissKeyboard}> <View /> </TouchableWithoutFeedback> ) } })
используйте 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и вы хотели бы усилить, чтобы закрыть клавиатуру, вы можете использовать простойTouchableWithoutFeedbackи естьonPressиспользуйте библиотеку утилит React NativedismissKeyboardзакрыть клавиатуру для вас.в вашем примере, вы могли бы сделать что-то вроде этого:
var DismissKeyboard = require('dismissKeyboard'); // Require React Native's 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как показано выше.
простой ответ-использовать ScrollView вместо View и установить свойство прокрутки в false (возможно, потребуется настроить некоторый стиль).
таким образом, клавиатура отклоняется в тот момент, когда я нажимаю где-то еще. Это может быть проблема с react-native, но события tap, похоже, обрабатываются только с помощью ScrollViews, что приводит к описанному поведению.
Edit: благодаря jllodra. Обратите внимание, что если вы нажмете непосредственно на другой Textinput, а затем снаружи, клавиатура все равно не скроется.
я совершенно новый, чтобы реагировать, и столкнулся с той же проблемой при создании демо-приложения. Если вы используете
onStartShouldSetResponderprop (описано здесь), вы можете захватить прикосновения на простой старыйReact.View. Любопытно услышать мысли более опытных реакционеров об этой стратегии / если есть лучшая, но это то, что сработало для меня:containerTouched(event) { this.refs.textInput.blur(); return false; } render() { <View onStartShouldSetResponder={this.containerTouched.bind(this)}> <TextInput ref='textInput' /> </View> }2 вещи, чтобы отметить здесь. Во-первых, как обсуждалось здесь, еще нет способа закончить редактирование всех подвидов, поэтому мы должны обратитесь к
TextInputнапрямую, чтобы размыть его. Во-вторых,onStartShouldSetResponderперехватывается другими осязаемыми элементами управления поверх него. Так что нажмите наTouchableHighlightи т. д. (В том числе другойTextInput) в виде контейнера не событие. Однако, нажав наImageв представлении контейнера по-прежнему будет отклонять клавиатуру.
вы можете импорт
keyboardС react-native, как показано ниже:import { Keyboard } from 'react-native';и в коде сделать что-то вроде этого:
render() { return ( <TextInput onSubmit={Keyboard.dismiss} /> ); }статический уволить()
отключает активную клавиатуру и удаляет фокус.
использовать
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>
Если кому-то нужен рабочий пример того, как уволить многострочный ввод текста здесь я иду! Надеюсь, это поможет некоторым людям там, документы не описывают способ отказаться от многострочного ввода вообще, по крайней мере, не было никакой конкретной ссылки на то, как это сделать. Тем не менее, 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> ) } }
обновленное использование
ScrollViewнаReact Native 0.39<ScrollView scrollEnabled={false} contentContainerStyle={{flex: 1}} />хотя, есть еще проблема с двумя
TextInputкоробок. например. Форма имени пользователя и пароля теперь будет отклонять клавиатуру при переключении между входами. Хотелось бы получить некоторые предложения, чтобы сохранить клавиатуру в живых при переключении междуTextInputsпри использованииScrollView.
const dismissKeyboard = require('dismissKeyboard'); dismissKeyboard(); //dismisses itПодход № 2;
Спасибо пользователю @ricardo-stuven за указание на это, есть еще один лучший способ уволить клавиатуру, которую вы можете увидеть в пример в react native docs.
простой импорт
Keyboardи вызовите это методdismiss()
Если я не ошибаюсь, последняя версия React Native решила эту проблему, чтобы закрыть клавиатуру, нажав.
Я только что протестировал это, используя последнюю версию React Native (0.4.2), и клавиатура отклоняется при нажатии в другом месте.
и FYI: вы можете установить функцию обратного вызова, которая будет выполняться при отклонении клавиатуры, назначив ее опоре "onEndEditing".
Как насчет размещения осязаемого компонента вокруг / рядом с
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> ) } }
https://facebook.github.io/react-native/docs/keyboard.html
использовать
Keyboard.dismiss(0);чтобы скрыть клавиатуру.
используя
keyboardShouldPersistTapsнаScrollViewвы можете передать в "handled", который имеет дело с проблемами, которые люди говорят, приходит с помощью ScrollView. Вот что говорится в документации об использовании 'handled':the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor).здесь там, где он ссылается.
обертывание компонентов в
TouchableWithoutFeedbackможет вызвать некоторое странное поведение прокрутки и другие проблемы. Я предпочитаю обернуть мое самое верхнее приложение вViewСonStartShouldSetResponderсвойства заполнены. Это позволит мне обрабатывать все unhandledTouches (а затем уволить клавиатуру):"'
handleUnhandledTouches(){ Keyboard.dismiss return false; } render(){ <View style={{ flex: 1 }} onStartShouldSetResponder={this.handleUnhandledTouches}> <MyApp> </View> }"'
Keyboard.dismiss()будет делать это. Но иногда он может потерять фокус, и клавиатура не сможет найти ref. Наиболее последовательный способ сделать это-поставитьref=_refв textInput, и сделать_ref.blur()когда нужно уволить, и_ref.focus()когда вам нужно вернуть клавиатуру.
Comments