certmundo.
es‑mx

6 min de lectura

¿Cómo manejar eventos y navegación entre pantallas en Android?

Manejar eventos y navegar entre pantallas significa capturar acciones del usuario con listeners y usar Intent para moverse de una Activity a otra.

Qué es un evento en Android

Un evento ocurre cada vez que el usuario interactúa con la pantalla. Los eventos más comunes son: tocar un botón, escribir texto y deslizar una lista.

Android notifica tu código mediante listeners. Un listener es un bloque de código que se ejecuta cuando ocurre el evento.

Cómo asignar un listener a un botón

La forma más directa es usar .setOnClickListener { } sobre la referencia del botón.

binding.btnCalcular.setOnClickListener {
    // Este código corre cuando el usuario toca el botón
}

Con View Binding, accedes al botón por su id sin necesidad de findViewById(). El bloque { } es una lambda que Kotlin ejecuta al detectar el toque.

Ejemplo 1: botón que muestra un mensaje

Imagina una app de ofertas para Liverpool. Cuando el usuario toca "Ver precio", aparece el descuento calculado.

binding.btnVerPrecio.setOnClickListener {
    val precioOriginal = binding.etPrecio.text.toString().toDoubleOrNull() ?: 0.0
    val descuento = precioOriginal * 0.20
    val precioFinal = precioOriginal - descuento
    binding.tvResultado.text = "Precio con 20% de descuento: $${String.format("%,.0f", precioFinal)}"
}

El resultado en pantalla sería: Precio con 20% de descuento: $1,200 si el precio original era $1,500.

Qué es un Intent

Un Intent es un objeto que describe una acción. Android lo usa para iniciar otra Activity, abrir una app externa o llamar al sistema operativo.

Existen dos tipos:

Tipo Descripción Ejemplo
Explícito Apunta a una clase específica de tu app Abrir DetalleActivity
Implícito Le pide al sistema que encuentre quién puede hacer la acción Abrir el navegador

En navegación interna siempre usas Intent explícito.

Cómo navegar entre dos Activities

Paso 1: crear la segunda Activity

En Android Studio, haz clic derecho sobre el paquete → New → Activity → Empty Views Activity. Nómbrala DetalleActivity. Android Studio genera el archivo .kt y su layout XML automáticamente.

Paso 2: lanzar la Activity desde un botón

binding.btnVerDetalle.setOnClickListener {
    val intent = Intent(this, DetalleActivity::class.java)
    startActivity(intent)
}

this es el contexto de la Activity actual. DetalleActivity::class.java es la referencia a la clase destino.

Ejemplo 2: flujo de inicio de sesión al estilo Mercado Libre

Tienes LoginActivity con dos campos (usuario y contraseña) y un botón "Entrar". Al tocar el botón, la app navega a InicioActivity.

// Dentro de LoginActivity.kt
binding.btnEntrar.setOnClickListener {
    val usuario = binding.etUsuario.text.toString()
    val contrasena = binding.etContrasena.text.toString()

    if (usuario.isNotEmpty() && contrasena.isNotEmpty()) {
        val intent = Intent(this, InicioActivity::class.java)
        startActivity(intent)
    } else {
        binding.tvError.text = "Completa todos los campos"
    }
}

Si los campos están vacíos, muestra un mensaje de error en pantalla. Si están completos, navega a la pantalla principal.

Cómo enviar datos entre Activities con extras

Un extra es un dato que adjuntas al Intent antes de enviarlo. La Activity destino lo recupera al llegar.

Enviar el dato

binding.btnVerPedido.setOnClickListener {
    val numeroPedido = binding.etPedido.text.toString()
    val intent = Intent(this, DetallePedidoActivity::class.java)
    intent.putExtra("NUMERO_PEDIDO", numeroPedido)
    startActivity(intent)
}

Recuperar el dato en la Activity destino

// Dentro de DetallePedidoActivity.kt → onCreate()
val numeroPedido = intent.getStringExtra("NUMERO_PEDIDO") ?: "Sin número"
binding.tvNumeroPedido.text = "Pedido: $numeroPedido"

intent (minúscula) es una propiedad de toda Activity que contiene el Intent con el que fue iniciada.

Ejemplo 3: app de rutas FEMSA

Una app para repartidores de FEMSA muestra una lista de tiendas. Al tocar una tienda, la app navega a RutaActivity y le pasa el nombre de la tienda y el monto a cobrar.

// En ListaTiendasActivity.kt
binding.btnTiendaCentro.setOnClickListener {
    val intent = Intent(this, RutaActivity::class.java)
    intent.putExtra("NOMBRE_TIENDA", "Oxxo Centro")
    intent.putExtra("MONTO_COBRAR", 3500)
    startActivity(intent)
}
// En RutaActivity.kt → onCreate()
val nombreTienda = intent.getStringExtra("NOMBRE_TIENDA") ?: ""
val montoCobrar = intent.getIntExtra("MONTO_COBRAR", 0)

binding.tvTienda.text = nombreTienda
binding.tvMonto.text = "Monto a cobrar: $$montoCobrar"

La pantalla de ruta mostraría: Oxxo Centro y Monto a cobrar: $3,500.

Cómo regresar a la pantalla anterior

Cuando el usuario toca el botón de atrás, Android cierra la Activity actual y regresa a la anterior. También puedes hacerlo desde código:

binding.btnRegresar.setOnClickListener {
    finish()
}

finish() cierra la Activity actual y la elimina de la pila de navegación.

Otros eventos comunes

Además del clic, existen otros listeners útiles:

Listener Cuándo se usa
setOnLongClickListener Toque prolongado sobre una vista
addTextChangedListener Cada vez que el usuario escribe en un EditText
setOnCheckedChangeListener Cuando un CheckBox o Switch cambia de estado

Ejemplo con addTextChangedListener

Una app de Bimbo valida en tiempo real que el RFC del cliente tenga al menos 12 caracteres.

binding.etRfc.addTextChangedListener { texto ->
    val longitud = texto?.length ?: 0
    if (longitud < 12) {
        binding.tvAviso.text = "RFC incompleto"
    } else {
        binding.tvAviso.text = ""
    }
}

Cada letra que el usuario escribe dispara la lambda y actualiza el aviso al instante.

Errores comunes

Error 1: olvidar registrar la Activity en AndroidManifest.xml. Cada Activity debe declararse en el manifiesto. Android Studio lo hace automáticamente si creas la Activity desde el menú. Si la creas a mano, debes agregarla tú.

<activity android:name=".DetalleActivity" />

Si no la registras, la app lanza una excepción ActivityNotFoundException al intentar abrirla.

Error 2: usar la clave incorrecta al recuperar un extra. Si en el emisor usas "NUMERO_PEDIDO" y en el receptor escribes "numeroPedido", el valor regresa null. Usa constantes para evitar errores de tipeo.

// Declara la clave en el companion object de la Activity destino
companion object {
    const val EXTRA_PEDIDO = "NUMERO_PEDIDO"
}

Error 3: llamar a startActivity() fuera del hilo principal. Siempre lanza Intents desde el hilo principal (UI thread). Si lo haces desde una coroutine, usa withContext(Dispatchers.Main) { } para cambiar al hilo correcto antes de llamar a startActivity().

Error 4: no manejar el caso null al recuperar extras. Usa siempre el operador Elvis ?: "valor por defecto" al leer un extra de tipo String. Si el Intent llega sin el extra, getStringExtra() devuelve null y tu app puede fallar.

Referencia rápida de Intent explícito

Paso Código
Crear Intent val intent = Intent(this, OtraActivity::class.java)
Agregar dato intent.putExtra("CLAVE", valor)
Lanzar Activity startActivity(intent)
Recuperar String intent.getStringExtra("CLAVE")
Recuperar Int intent.getIntExtra("CLAVE", 0)
Cerrar Activity finish()

Puntos clave

  • Un listener como .setOnClickListener { } es la forma estándar de capturar toques en cualquier vista.
  • Usa Intent explícito para navegar entre Activities de tu propia app: Intent(this, Destino::class.java).
  • Adjunta datos al Intent con .putExtra("CLAVE", valor) y recupéralos en el destino con intent.getStringExtra("CLAVE").
  • Todas las Activities deben estar registradas en AndroidManifest.xml; de lo contrario, la app lanza una excepción.
  • Usa constantes para las claves de los extras y el operador Elvis ?: al recuperarlos para evitar valores null inesperados.

Puntos clave

  • Asigna `.setOnClickListener { }` a cualquier botón para capturar el toque del usuario y ejecutar lógica en la lambda.
  • Navega entre pantallas con `Intent(this, OtraActivity::class.java)` seguido de `startActivity(intent)`; toda Activity destino debe estar declarada en `AndroidManifest.xml`.
  • Envía datos entre Activities con `intent.putExtra("CLAVE", valor)` y recupéralos en el destino con `intent.getStringExtra("CLAVE")` o `intent.getIntExtra("CLAVE", 0)`.
  • Usa constantes para las claves de los extras y el operador Elvis `?:` para evitar excepciones por valores `null` al recuperar datos.
  • Llama a `finish()` para cerrar la Activity actual y regresar a la pantalla anterior sin necesidad de crear un nuevo Intent.

Comparte esta lección:

¿Cómo manejar eventos y navegación entre pantallas en Android? | Kotlin para Android: Curso Práctico | Certmundo