TextInput y Teclado
Volver a clases
Desarrollo Móvil●●Intermedio

TextInput y Teclado

120 min

Configuración de TextInput, tipos de teclado, manejo de focus y prevención de solapamiento con el teclado.

TextInput Básico

typescript
1import { 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

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

typescript
1import {
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

typescript
1import { 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, email y contraseña.
  • Configurar keyboardType, autoCapitalize y secureTextEntry según el campo.
  • Usar KeyboardAvoidingView y cerrar teclado con TouchableWithoutFeedback.
  • Implementar focus entre inputs con returnKeyType y refs.

Desafío de Código

EjercicioIntermedio15 min🔴 Sin IA

Ejercicios Prácticos

Resuelve las instrucciones dentro de la practica anterior.

  1. Agrega un campo "Teléfono" con keyboardType="phone-pad" y validación mínima de 10 dígitos.
  2. Implementa un botón "Siguiente" que haga focus al siguiente input.
  3. Añade un campo "Edad" con keyboardType="numeric" y limita a 2 dígitos.
  4. Ajusta blurOnSubmit para que el teclado no se cierre al avanzar entre campos.

Documentación Oficial

DocumentaciónPrincipiante0

TextInput API

Propiedades y eventos disponibles en TextInput.

Documentación Oficial

DocumentaciónPrincipiante0

KeyboardAvoidingView

Ajustes de layout para evitar que el teclado cubra inputs.

Documentación Oficial

DocumentaciónPrincipiante0

Keyboard API

Eventos para detectar apertura y cierre del teclado.

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.

jsx
1export 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:

  1. El usuario toca el campo "Cuéntanos de ti" (que está al fondo). ¿Qué ve?
  2. Al escribir su correo, el teléfono le pone mayúscula inicial y le autocorrige el dominio. ¿Qué props faltan?
  3. Terminó de escribir y quiere cerrar el teclado. ¿Puede? ¿Qué agregas?
  4. En el campo Nombre, el botón del teclado dice "intro" y no lleva al siguiente campo. ¿Qué par de props resuelven el flujo?
  5. Escribe la estructura corregida (esqueleto con las props clave, sin repetir todo).

La solución no se publica. Se revisa en voz alta en el laboratorio, después de que trabajaste el reto. Trae tu diagnóstico escrito: eso es lo que se entrega.