Definí dos campos TextInput de la siguiente manera:
<TextInput
style = {styles.titleInput}
returnKeyType = {"next"}
autoFocus = {true}
placeholder = "Title" />
<TextInput
style = {styles.descriptionInput}
multiline = {true}
maxLength = {200}
placeholder = "Description" />
Pero después de presionar el botón "siguiente" en mi teclado, mi aplicación nativa de reacción no salta al segundo campo TextInput. ¿Cómo puedo lograr eso?
¡Gracias!
ios
react-native
andreaswienes
fuente
fuente
v16.8.0
o superior, recomendaría la respuesta proporcionada por @Eli Johnson en la parte inferior. React ha desaprobado muchos usos de losref
proporcionados en las siguientes soluciones.Respuestas:
Ajustar el segundo
TextInput
enfoque, cuando el anteriorTextInput
'sonSubmitEditing
se dispara.Prueba esto
Agregar una referencia a la segunda entrada de texto
ref={(input) => { this.secondTextInput = input; }}
Enlace la función de enfoque al primer evento onSubmitEditing de TextInput .
onSubmitEditing={() => { this.secondTextInput.focus(); }}
Recuerde establecer blurOnSubmit en false, para evitar el parpadeo del teclado.
blurOnSubmit={false}
fuente
onSubmitEditing
devolución de llamada se llama después delblur
evento. Por lo tanto, el teclado puede volverse loco si se enfoca en el siguiente elemento de inmediato. Por lo tanto, puede ser útil establecerblurOnSubmit={false}
todos los elementos en forma, pero dejar entrue
el último elemento, para permitir que el botón Listo borre la última entrada.blurOnSubmit={false}
para evitar el parpadeo del teclado, esto dejó de funcionar, ¿alguien que sepa lo que está sucediendo?focus
trabajo, asegúrese de no usar un contenedor para elTextInput
componente. Si tiene unCustomTextInput
componente de voz que se ajustaTextInput
, necesita implementarTextInput
métodos de desenfoque y enfoque para ese componente para que funcione como se esperaba.Puedes hacer esto sin usar referencias . Se prefiere este enfoque, ya que las referencias pueden conducir a un código frágil . Los documentos de React aconsejan encontrar otras soluciones cuando sea posible:
En su lugar, utilizaremos una variable de estado para enfocar el segundo campo de entrada.
Agregue una variable de estado que pasaremos como accesorio a la
DescriptionInput
:Defina un método de controlador que establezca esta variable de estado en verdadero:
Al enviar / presionar enter / next en el
TitleInput
, lo llamaremoshandleTitleInputSubmit
. Esto estableceráfocusDescriptionInput
en verdadero.DescriptionInput
'focus
prop' se establece en nuestrafocusDescriptionInput
variable de estado. Entonces, cuando losfocusDescriptionInput
cambios (en el paso 3),DescriptionInput
se volverán a procesar confocus={true}
.Esta es una buena manera de evitar el uso de referencias, ya que las referencias pueden conducir a un código más frágil :)
EDITAR: h / t a @LaneRettig para señalar que necesitará ajustar React Native TextInput con algunos accesorios y métodos adicionales para que responda
focus
:fuente
A partir de React Native 0.36, las llamadas
focus()
(como se sugiere en varias otras respuestas) en un nodo de entrada de texto ya no son compatibles. En su lugar, puede usar elTextInputState
módulo de React Native. Creé el siguiente módulo auxiliar para facilitar esto:Puede, entonces, llamar a la
focusTextInput
función en cualquier "referencia" de aTextInput
. Por ejemplo:fuente
<Field ... onSubmitEditing={() => focusTextInput(this._password)} />
y el árbitro debería ser así<Field ... withRef refName={e => this._password = e}/>
calling focus() on a text input node isn't supported any more
=> reclamo en negrita, fuente? Llamandofocus()
funciona bien con v0.49.5 +TextInputState
no está documentado, mientras quefocus()
yblur()
se mencionan: facebook.github.io/react-native/releases/next/docs/...Creé una pequeña biblioteca que hace esto, no se necesita ningún cambio de código que no sea reemplazar su vista de ajuste e importar TextInput:
https://github.com/zackify/react-native-autofocus
Explicado en detalle aquí: https://zach.codes/autofocus-inputs-in-react-native/
fuente
Pensé que compartiría mi solución usando un componente de función ... ¡' esto ' no es necesario!
Aquí hay un ejemplo de mi componente:
No sé, espero que esto ayude a alguien =)
fuente
Usando react-native 0.45.1 también encontré problemas al tratar de establecer el foco en una contraseña TextInput después de presionar la tecla de retorno en un nombre de usuario TextInput.
Después de haber probado la mayoría de las soluciones mejor calificadas aquí en SO, encontré una solución en github que satisfizo mis necesidades: https://github.com/shoutem/ui/issues/44#issuecomment-290724642
Para resumirlo:
Y luego lo uso así:
fuente
ref
ainputRef
... Puede soltar todo su componente personalizado y su segundo bloque de código funcionará tal cual, siempre y cuando vuelva a usarloref
Para mí en RN 0.50.3 es posible de esta manera:
Debes ver esto.PasswordInputRef. _root .focus ()
fuente
Si estás usando
tcomb-form-native
como yo, también puedes hacerlo. Aquí está el truco: en lugar de configurar los accesoriosTextInput
directamente, lo haces a través deoptions
. Puede referirse a los campos del formulario como:Entonces el producto final se ve así:
(Crédito a remcoanker por publicar la idea aquí: https://github.com/gcanti/tcomb-form-native/issues/96 )
fuente
Así lo logré. Y el siguiente ejemplo ha utilizado la API React.createRef () presentada en React 16.3.
Creo que esto te ayudará.
fuente
Mi escenario es <CustomBoladonesTextInput /> envolviendo un RN <TextInput /> .
Resolví este problema de la siguiente manera:
Mi forma se ve así:
En la definición del componente CustomBoladonesTextInput, paso el refField al accesorio de referencia interno de esta manera:
Y voilá. Todo vuelve a funcionar de nuevo. Espero que esto ayude
fuente
Pruebe esta solución en los problemas de GitHub de React Native.
https://github.com/facebook/react-native/pull/2149#issuecomment-129262565
Debe usar el accesorio de referencia para el componente TextInput.
Luego, necesita crear una función que se invoque en onSubmitEditing prop que mueva el foco en la segunda referencia TextInput.
fuente
Usar referencias de devolución de llamada en lugar de las referencias de cadena heredadas :
fuente
Y agregue el método de la
onSubmitEditing={() => this.focusTextInput(this.refs.password)}
siguiente manera:fuente
Para que la solución aceptada funcione si
TextInput
está dentro de otro componente, deberá "hacer estallar" la referencia desderef
el contenedor principal.fuente
en su componente:
Nota: Solía
._root
porque es una referencia a TextInput en la entrada NativeBase 'Library'y en tus entradas de texto como esta
fuente
y agregar método
fuente
Hay una manera de capturar pestañas en a
TextInput
. Es hacky, pero mejor que nada .Defina un
onChangeText
controlador que compare el nuevo valor de entrada con el antiguo, buscando un\t
. Si encuentra uno, avance el campo como se muestra en @boredgamesSuponiendo que la variable
username
contiene el valor para el nombre de usuario ysetUsername
envía una acción para cambiarlo en la tienda (estado del componente, tienda redux, etc.), haga algo como esto:fuente
Aquí una solución de reactivo para un componente de entrada que tiene una propiedad: focus.
El campo se enfocará mientras este accesorio esté establecido en verdadero y no tendrá foco mientras sea falso.
Desafortunadamente, este componente necesita tener un: ref definido, no pude encontrar otra forma de llamar a .focus () en él. Estoy contento con las sugerencias.
https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5
fuente
swap!
unatom
tipo. Según los documentos, esto se usa para vincular a React: "Cualquier componente que use un átomo se vuelve a representar automáticamente cuando cambia su valor". reagent-project.github.ioSi está utilizando NativeBase como componentes de la interfaz de usuario, puede usar este ejemplo
fuente