Configuración de TextInput, tipos de teclado, manejo de focus y prevención de solapamiento con el teclado.
TextInput Básico
typescript1import { TextInput, StyleSheet } from "react-native"; 2import { useState } from "react"; 3 4function BasicForm() { 5 const [text, setText] = useState(""); 6 const [email, setEmail] = useState(""); 7 const [password, setPassword] = useState(""); 8 9 return ( 10 <View style={styles.container}> 11 <TextInput 12 style={styles.input} 13 value={text} 14 onChangeText={setText} 15 placeholder="Nombre" 16 placeholderTextColor="#999" 17 /> 18 19 <TextInput 20 style={styles.input} 21 value={email} 22 onChangeText={setEmail} 23 placeholder="Email" 24 keyboardType="email-address" 25 autoCapitalize="none" 26 autoComplete="email" 27 autoCorrect={false} 28 /> 29 30 <TextInput 31 style={styles.input} 32 value={password} 33 onChangeText={setPassword} 34 placeholder="Contraseña" 35 secureTextEntry 36 autoComplete="password" 37 /> 38 </View> 39 ); 40} 41 42const styles = StyleSheet.create({ 43 container: { 44 padding: 20, 45 }, 46 input: { 47 height: 50, 48 backgroundColor: "white", 49 borderWidth: 1, 50 borderColor: "#ddd", 51 borderRadius: 8, 52 paddingHorizontal: 15, 53 fontSize: 16, 54 marginBottom: 15, 55 }, 56});
Tipos de Teclado
typescript1<TextInput 2 keyboardType="default" // Teclado normal 3 keyboardType="email-address" // @ y .com 4 keyboardType="numeric" // Solo números 5 keyboardType="phone-pad" // Teclado de teléfono 6 keyboardType="decimal-pad" // Números con decimales 7 keyboardType="url" // .com / .net 8/>
Manejo del Teclado
typescript1import { 2 KeyboardAvoidingView, 3 Platform, 4 TouchableWithoutFeedback, 5 Keyboard, 6} from "react-native"; 7 8function FormWithKeyboard() { 9 return ( 10 <KeyboardAvoidingView 11 behavior={Platform.OS === "ios" ? "padding" : "height"} 12 style={styles.container} 13 > 14 <TouchableWithoutFeedback onPress={Keyboard.dismiss}> 15 <View style={styles.inner}> 16 <TextInput style={styles.input} placeholder="Nombre" /> 17 <TextInput style={styles.input} placeholder="Email" /> 18 <TouchableOpacity style={styles.button}> 19 <Text>Enviar</Text> 20 </TouchableOpacity> 21 </View> 22 </TouchableWithoutFeedback> 23 </KeyboardAvoidingView> 24 ); 25}
Focus y Refs
typescript1import { useRef } from "react"; 2 3function FormWithRefs() { 4 const emailRef = useRef<TextInput>(null); 5 const passwordRef = useRef<TextInput>(null); 6 7 return ( 8 <View> 9 <TextInput 10 placeholder="Nombre" 11 returnKeyType="next" 12 onSubmitEditing={() => emailRef.current?.focus()} 13 blurOnSubmit={false} 14 /> 15 16 <TextInput 17 ref={emailRef} 18 placeholder="Email" 19 returnKeyType="next" 20 onSubmitEditing={() => passwordRef.current?.focus()} 21 blurOnSubmit={false} 22 /> 23 24 <TextInput 25 ref={passwordRef} 26 placeholder="Contraseña" 27 returnKeyType="done" 28 onSubmitEditing={handleSubmit} 29 /> 30 </View> 31 ); 32}
Ejemplos de Código
3 ejemplos
TextInput con configuración esencial
typescript
1```typescript
2<TextInput
3 placeholder="Email"
4 keyboardType="email-address"
5 autoCapitalize="none"
6 autoCorrect={false}
7 autoComplete="email"
8/>
9```Evitar solapamiento del teclado
typescript
1```typescript
2<KeyboardAvoidingView
3 behavior={Platform.OS === "ios" ? "padding" : "height"}
4 style={{ flex: 1 }}
5/>
6```Focus encadenado con refs
typescript
1```typescript
2<TextInput
3 returnKeyType="next"
4 onSubmitEditing={() => emailRef.current?.focus()}
5 blurOnSubmit={false}
6/>
7```Recursos
6 recursos disponibles
Taller Práctico
TallerIntermedio15 min🟡 IA con bitácora
Práctica
Formulario
- Crear un formulario simple con
nombre,emailycontraseña. - Configurar
keyboardType,autoCapitalizeysecureTextEntrysegún el campo. - Usar
KeyboardAvoidingViewy cerrar teclado conTouchableWithoutFeedback. - Implementar focus entre inputs con
returnKeyTypey refs.
Desafío de Código
EjercicioIntermedio15 min🔴 Sin IA
Ejercicios Prácticos
Resuelve las instrucciones dentro de la practica anterior.
- Agrega un campo "Teléfono" con
keyboardType="phone-pad"y validación mínima de 10 dígitos. - Implementa un botón "Siguiente" que haga focus al siguiente input.
- Añade un campo "Edad" con
keyboardType="numeric"y limita a 2 dígitos. - Ajusta
blurOnSubmitpara que el teclado no se cierre al avanzar entre campos.
Documentación Oficial
Documentación Oficial
DocumentaciónPrincipiante0
KeyboardAvoidingView
Ajustes de layout para evitar que el teclado cubra inputs.
Documentación Oficial
Reto de Lectura
Reto de LecturaPrincipiante35 min🔴 Sin IA
Reto de Lectura — El formulario tapado
El primer usuario hostil de todo formulario móvil es el teclado. Este formulario lo ignora por completo: predice los 4 fallos de experiencia y corrígelos.
Este formulario de registro "funciona" en el emulador con teclado físico. En un teléfono real es una tortura. Predice los 4 problemas que vivirá el usuario y corrígelos.
jsx1export default function Registro() { 2 const [form, setForm] = useState({ nombre: "", correo: "", nota: "" }); 3 4 return ( 5 <View style={{ flex: 1, padding: 20 }}> 6 <TextInput 7 placeholder="Nombre" 8 value={form.nombre} 9 onChangeText={(v) => setForm({ ...form, nombre: v })} 10 /> 11 <TextInput 12 placeholder="Correo" 13 value={form.correo} 14 onChangeText={(v) => setForm({ ...form, correo: v })} 15 /> 16 <TextInput 17 placeholder="Cuéntanos de ti" 18 value={form.nota} 19 onChangeText={(v) => setForm({ ...form, nota: v })} 20 multiline 21 style={{ marginTop: "auto", height: 120 }} 22 /> 23 <Button title="Enviar" onPress={enviar} /> 24 </View> 25 ); 26}
Preguntas:
- El usuario toca el campo "Cuéntanos de ti" (que está al fondo). ¿Qué ve?
- Al escribir su correo, el teléfono le pone mayúscula inicial y le autocorrige el dominio. ¿Qué props faltan?
- Terminó de escribir y quiere cerrar el teclado. ¿Puede? ¿Qué agregas?
- En el campo Nombre, el botón del teclado dice "intro" y no lleva al siguiente campo. ¿Qué par de props resuelven el flujo?
- Escribe la estructura corregida (esqueleto con las props clave, sin repetir todo).
Clase 19 de 31 en la ruta Desarrollo movil