Saltar la navegación

3.2.3. Intent

Lo más probable, sobre todo si no utilizamos fragments, es que nuestra app esté compuesta de más de una activity. Para navegar de una a otra, podemos utilizar un objeto intent. Veámoslo con un ejemplo: vamos a crear una nueva actividad en nuestra app. En el menú de Android Studio, seleccionamos File > New > Activity > Empty Activity y aceptamos las opciones por defecto de la nueva actividad. El wizard añadirá no solo una clase MainActivity2, sino también su layout y la línea en el manifiesto. Para navegar de nuestra actividad a la nueva, modificaremos el código de este modo:

override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            findViewById

Creamos un objeto intent:

  1. el primer parámetro es el contexto del paquete, pero valdrá con el contexto de nuestra actividad.
  2. El segundo parámetro es la clase de la activity a la que deseamos navegar.

Una vez creado el intent, llamaremos a la función de la startActivity con él y la nueva actividad se mostrará sobre la actual. Decimos "sobre" porque el sistema Android guardará una pila de vistas una sobre otra según vayamos abriéndolas, lo que se conoce como back stack. Cuando cerremos (destruyamos) una ventana, presionando Atrás, por ejemplo, se mostrará la anterior, la que está debajo en la pila.

Back Stack

Paso de información entre Activities

Cuando llamamos a otra activity, tanto dentro como fuera de nuestra app, podemos leer la información que devuelve. Para ello, en la Actividad principal debe existir el siguiente código:

btnLanzarSegundaActividad.setOnClickListener {
    val intent = Intent(this, OtraActivity::class.java)   // Declaramos un Intent para cambiar a la "Otra" actividad
    findViewById

La nueva actividad se mostrará, el usuario utilizará sus funciones y, cuando termine, la actividad se cerrará y devolverá los datos. En la primera activity, tendríamos un código para recibir esos datos, algo como:

 val getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
        Log.d("MainActivity", "vengo")              // Se muestra en Log la vuelta
        if (result.resultCode == Activity.RESULT_OK) {      // Si ha ido bien...
            Log.d("MainActivity", "OK")             // Se muestra el mensaje OK
            val data: Intent? = result.data                 // Se recoge el resultado del Intent devuelto

            if (data != null) {                             // Si el dato no es nulo...
                Log.d("MainActivity", data.toString())  // Se muestran los datos devueltos
                // Se muestra en la etiqueta el dato devuelto
                findViewById(R.id.tvSaludo).text = data.getStringExtra("datos")
            }
        }
    }

Sobrescribimos el método de la activity getResult para obtener los datos devueltos por la activity. Este método nos informa sobre el resultado mediante sus dos parámetros:

  • resultCode: normalmente será una de los valores RESULT_OK (para indicar que la actividad terminó adecuadamente y pueden utilizarse los valores devueltos) y RESULT_CANCELED (si el usuario canceló el proceso y debemos tomar las medidas adecuadas ante el rechazo del proceso).
  • data: un objeto intent con los datos requeridos por la activity que lanzamos. Podremos obtener los datos mediante diferentes métodos en función al tipo de datos, como getStringExtra, getIntExtra, getBooleanExtra, getByteExtra, etcétera.

Ejercicio

Crea un proyecto con dos Actividades vacías.

La primera Activity y su layout contendrán el código mostrado anteriormente para que, a través del botón, se muestre la segunda.

La segunda tendrá en su Activity y layout respectivamente, el siguiente código:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout   
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".OtraActivity"> <button android:id="@+id/btnVolver"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
android:text="Volver"
app:layout_constraintbottom_tobottomof="parent"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_tobottomof="@+id/lblMensaje"> <textview android:id="@+id/lblMensaje"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Esta es la segunda actividad"
app:layout_constraintbottom_tobottomof="parent"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_totopof="parent"> </textview> </button> </androidx.constraintlayout.widget.constraintlayout>



import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_second.*
class OtraActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_otra)
        btnVolver.setOnClickListener {
            onClick(it)
        }
    }
    fun onClick(view: android.view.View) {
        val intent = Intent()
        val datos = "Estos son datos generados en ${OtraActivity::class.simpleName}"
        intent.putExtra("datos", datos)
        setResult(RESULT_OK, intent)
        finish()
    }
}

Observa el código del método onClick. Este método crea un intent y, mediante la función putExtra, introduce en él los datos que va a devolver. La llamada a setResult devolverá el intent, pasando además como resultado RESULT_OK para indicar que el proceso se llevó a cabo satisfactoriamente. No queda más que terminar el proceso llamando a finish, que cerrará la actividad y volverá a la anterior.

Creado con eXeLearning (Ventana nueva)