react open keyboardshouldpersisttaps keyboardavoidingview keep don reactjs react-native

reactjs - open - Ocultar teclado en react-native



react native keep keyboard open (25)

Utilice React Native Keyboard.dismiss()

Respuesta actualizada

React Native expuso el método estático de dismiss() en el Keyboard , por lo que el método actualizado es:

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

Respuesta original

Utilice la biblioteca de github.com/facebook/react-native/blob/master/Libraries/… de github.com/facebook/react-native/blob/master/Libraries/… React Native.

Tuve un problema muy similar y sentí que era el único que no lo entendió.

ScrollViews

Si tiene un ScrollView , o cualquier cosa que herede de él como ListView , puede agregar un accesorio que descarte automáticamente el teclado en función de presionar o arrastrar eventos.

El accesorio es keyboardDismissMode y puede tener un valor de none , interactive o on-drag . Puedes leer más sobre eso keyboardDismissMode .

Vistas regulares

Si tiene algo más que un ScrollView y desea presionar para descartar el teclado, puede usar un simple TouchableWithoutFeedback y hacer que onPress use la biblioteca de utilidades React Native para descartar el teclado por usted.

En su ejemplo, podría hacer algo como esto:

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>

Nota: TouchableWithoutFeedback solo puede tener un solo hijo, por lo que debe envolver todo debajo de él en una sola View como se muestra arriba.

Si toco una entrada de texto, quiero poder tocar en otro lugar para cerrar nuevamente el teclado (aunque no la tecla de retorno). No he encontrado la más mínima información sobre esto en todos los tutoriales y publicaciones de blog que leí.

Este ejemplo básico todavía no funciona para mí con react-native 0.4.2 en el simulador. No pude probarlo en mi iPhone todavía.

<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>



¿Qué hay de colocar un componente táctil alrededor / al lado de 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> ) } }


Acabo de probar esto usando la última versión React Native (0.4.2), y el teclado se cierra cuando tocas en otro lado.

Y para su información: puede configurar una función de devolución de llamada para que se ejecute cuando descarta el teclado asignándolo al accesorio "onEndEditing".


Ajustar sus componentes en un TouchableWithoutFeedback puede causar un comportamiento de desplazamiento extraño y otros problemas. Prefiero envolver mi aplicación superior en una View con la propiedad onStartShouldSetResponder completada. Esto me permitirá manejar todos los toques no manejados y luego cerrar el teclado. Es importante destacar que, dado que la función del controlador devuelve falso, el evento táctil se propaga como normal.

handleUnhandledTouches(){ Keyboard.dismiss return false; } render(){ <View style={{ flex: 1 }} onStartShouldSetResponder={this.handleUnhandledTouches}> <MyApp> </View> }


Aquí está mi solución para descartar y desplazar el teclado a TextInput girado (estoy usando ScrollView con keyboardDismissMode prop):

<ScrollView keyboardDismissMode={''on-drag''}> //content </ScrollView>

uso:

<KeyboardAvoidingView behavior=''padding'' style={{ flex: 1}}> //inputs and other content </KeyboardAvoidingView>


El problema con el teclado no se descarta se vuelve más grave si tiene keyboardType=''numeric'' , ya que no hay forma de descartarlo.

Reemplazar la vista con ScrollView no es una solución correcta, ya que si tiene varias textInput o button , al tocarlos mientras el teclado está arriba solo se descartará el teclado.

La forma correcta es encapsular View con TouchableWithoutFeedback y llamar a Keyboard.dismiss()

EDITAR: ahora puede usar ScrollView con keyboardShouldPersistTaps=''handled'' para descartar el teclado solo cuando el toque no es manejado por los niños (es decir, tocando otras entradas de texto o botones)

Si usted tiene

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

Cámbialo a

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

o

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

EDITAR: También puede crear un Componente de orden superior para descartar el teclado.

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)

Simplemente úsalo así

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

NOTA: el accessible={false} es necesario para que el formulario de entrada siga siendo accesible a través de VoiceOver. ¡Las personas con discapacidad visual se lo agradecerán!


Hay algunas formas, si controlas un evento como onPress puedes usar:

keyboardShouldPersistTaps="handled"

si desea cerrar el teclado cuando use el desplazamiento:

import React from ''react''; import { Platform, KeyboardAvoidingView, ScrollView } from ''react-native''; const DismissKeyboard = ({ children }) => { const isAndroid = Platform.OS === ''android''; const behavior = isAndroid ? false : ''padding''; return ( <KeyboardAvoidingView enabled behavior={ behavior } style={{ flex: 1}} > <ScrollView keyboardShouldPersistTaps={''always''} keyboardDismissMode={''on-drag''} > { children } </ScrollView> </KeyboardAvoidingView> ); }; export default DismissKeyboard;

Más opción es cuando el usuario hace clic fuera del teclado:

render(){ return( <DismissKeyboard> <TextInput style={{height: 40, borderColor: ''gray'', borderWidth: 1}} onChangeText={(text) => this.setState({text})} value={this.state.text} /> </DismissKeyboard> ); }


Hay muchas formas de manejar esto, las respuestas anteriores no incluyen returnType ya que no estaba incluido en react-native esa vez.

1: Puede resolverlo envolviendo sus componentes dentro de ScrollView, por defecto ScrollView cierra el teclado si presionamos en algún lugar. Pero en caso de que quiera usar ScrollView pero deshabilite este efecto. puede usar pointerEvent prop para scrollView pointerEvents = ''none'' .

2: Si desea cerrar el teclado al presionar un botón, puede usar el Keyboard desde react-native

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

3: También puede cerrar el teclado cuando hace clic en la tecla de retorno en el teclado, NOTA: si su tipo de teclado es numérico, no tendrá una tecla de retorno. Por lo tanto, puede habilitarlo dándole un apoyo, returnKeyType a done . o puede usar onSubmitEditing={Keyboard.dismiss} , se llama cada vez que presionamos la tecla de retorno. Y si desea descartar el teclado al perder el foco, puede usar onBlur prop, onBlur = {Keyboard.dismiss}


La respuesta simple es usar un ScrollView en lugar de View y establecer la propiedad desplazable en false (aunque podría necesitar un poco de estilo).

De esta manera, el teclado se descarta en el momento en que toco en otro lugar. Esto podría ser un problema con react-native, pero los eventos de tap solo parecen manejarse con ScrollViews, lo que conduce al comportamiento descrito.

Editar: Gracias a jllodra. Tenga en cuenta que si toca directamente en otra entrada de texto y luego afuera, el teclado aún no se ocultará.


Primer teclado de importación

import { Keyboard } from ''react-native''

Luego, dentro de su TextInput , agrega Keyboard.dismiss al accesorio onSubmitEditing . Deberías tener algo parecido a esto:

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


Puede importar el keyboard desde react-native como a continuación:

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

y en su código podría ser algo como esto:

containerTouched(event) { this.refs.textInput.blur(); return false; } render() { <View onStartShouldSetResponder={this.containerTouched.bind(this)}> <TextInput ref=''textInput'' /> </View> }

despido estático ()

Descarta el teclado activo y elimina el foco.


Si alguien necesita un ejemplo práctico de cómo descartar una entrada de texto multilínea aquí ¡ya está! Espero que esto ayude a algunas personas, los documentos no describen una forma de descartar una entrada multilínea, al menos no había una referencia específica sobre cómo hacerlo. Todavía es un novato para publicar realmente aquí en la pila, si alguien piensa que esto debería ser una referencia a la publicación real para la que se escribió este fragmento, hágamelo saber.

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> ) } }


Si no me equivoco, la última versión de React Native ha resuelto este problema de poder descartar el teclado tocando.


Soy nuevo en React y me encontré exactamente con el mismo problema al hacer una aplicación de demostración. Si usa el accesorio onStartShouldSetResponder (descrito here ), puede obtener toques en un viejo React.View . Curioso por escuchar los pensamientos de los Reactores más experimentados sobre esta estrategia / si hay una mejor, pero esto es lo que funcionó para mí:

import { Keyboard } from ''react-native'';

2 cosas a tener en cuenta aquí. Primero, como se discutió github.com/facebook/react-native/issues/113 , todavía no hay una manera de finalizar la edición de todas las subvistas, por lo que debemos referirnos directamente a TextInput para desdibujarlo. En segundo lugar, el onStartShouldSetResponder es interceptado por otros controles táctiles en la parte superior. Por lo tanto, hacer clic en un TouchableHighlight etc. (incluido otro TextInput ) dentro de la vista del contenedor no activará el evento. Sin embargo, al hacer clic en una Image dentro de la vista del contenedor, se cerrará el teclado.


Usando keyboardShouldPersistTaps en ScrollView puede pasar "manejado", que se ocupa de los problemas que la gente dice que viene con el uso de ScrollView. Esto es lo que dice la documentación sobre el uso de ''manejado'': the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor). Here es donde se hace referencia.


Use ScrollView lugar de View y configure el atributo keyboardShouldPersistTaps en falso.

<ScrollView style={styles.container} keyboardShouldPersistTaps={false}> <TextInput placeholder="Post Title" onChange={(event) => this.updateTitle(event.nativeEvent.text)} style={styles.default}/> </ScrollView>


Uso actualizado de ScrollView para React Native 0.39

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

Aunque, todavía hay un problema con dos cuadros TextInput . p.ej. Un formulario de nombre de usuario y contraseña ahora descartaría el teclado al cambiar entre entradas. Me encantaría recibir algunas sugerencias para mantener vivo el teclado al cambiar entre TextInputs mientras se usa ScrollView .


en uso ScrollView

import { Keyboard } from ''react-native'' onClickFunction = () => { Keyboard.dismiss() }

Esto hará tu trabajo.


prueba keyboard.dismiss() . Funciono para mi


use esto para el despido personalizado

var dismissKeyboard = require(''dismissKeyboard''); var TestView = React.createClass({ render: function(){ return ( <TouchableWithoutFeedback onPress={dismissKeyboard}> <View /> </TouchableWithoutFeedback> ) } })



Keyboard.dismiss() lo hará. Pero a veces puede perder el foco y Keyboard no podrá encontrar la referencia. La forma más coherente de hacerlo es poner un ref=_ref en textInput y hacer _ref.blur() cuando necesite descartar, y _ref.focus() cuando necesite recuperar el teclado.


El módulo de teclado se usa para controlar eventos de teclado.

  • import { Keyboard } from ''react-native''
  • Agregue el siguiente código en el método de representación.

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

Puedes usar -

Keyboard.dismiss()

despido estático () Descarta el teclado activo y elimina el foco según los documentos nativos de reacción.


const dismissKeyboard = require(''dismissKeyboard''); dismissKeyboard(); //dismisses it

Enfoque n. ° 2;

Gracias al usuario @ ricardo-stuven por señalar esto, hay otra mejor manera de descartar el teclado que puede ver en el github.com/facebook/react-native/blob/… en los documentos nativos de reacción.

Importar Keyboard simple y llamar a su método dismiss()