Creación de nuevas actividades

El concepto de actividad en Android representa una unidad de interacción con el usuario. Corresponde a lo que coloquialmente llamamos una pantalla de la aplicación. Una aplicación suele estar formada por una serie de actividades, de forma que el usuario puede ir navegando entre actividades. En concreto, Android suele disponer de un botón (físico o en pantalla) que nos permite volver a la actividad anterior.

video[Tutorial] Actividades en Android

Layout aunque no es imprescindible, como se verá en el siguiente ejemplo. 

Toda actividad ha de tener una vista asociada, que será utilizada como interfaz de usuario. Esta vista suele ser de tipo layout, aunque también puede ser una vista simple, como se verá en el siguiente ejemplo.
Una aplicación estará formada por un conjunto de actividades independientes; es decir, se trata de clases independientes que no comparten variables, aunque todas trabajan para un objetivo común. Otro aspecto importante es que toda actividad ha de ser una subclase de Activity.

Las aplicaciones creadas hasta ahora disponían de una única actividad. Esta era creada automáticamente y se le asignaba la vista definida en res/layout/activity_main.xml. Esta actividad era arrancada al comenzar la aplicación. A medida que nuestra aplicación crezca va a ser imprescindible crear nuevas actividades. En este apartado describiremos como hacerlo. Este proceso se puede resumir en cuatro pasos:

  • *Crear un nuevo Layout para la actividad.
  • *Crear una nueva clase descendiente de Activity. En esta clase tendrás que indicar que el Layout a visualizar es el desarrollado en el punto anterior.
  • *Para que nuestra aplicación sea visible será necesario activarla desde otra actividad.
  • *De forma obligatoria tendremos que registrar toda nueva actividad en AndroidManifest.xml

Veamos un primer ejemplo de cómo crear una nueva actividad en la aplicación que estamos desarrollando.

Ejercicio: Implementación de una caja Acerca de

Vamos a crear una caja Acerca de… y visualizarla cuando se pulse el botón adecuado.

1. En primer lugar crea el fichero res/layout/acercade.xml. Para ello pulsa con el botón derecho sobre el explorador del proyecto en la carpeta res/layout y selecciona New > Layout resource file. Indica en File name: acercade.

2. Selecciona la lengüeta Text y copia el siguiente contenido:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="@dimen/text_margin"
    android:text="Este programa ha sido desarrollado como ejemplo en el curso de Android para demostrar cómo se pueden lanzar nuevas actividades desde la actividad principal.">
</TextView> 

3. Creamos ahora una nueva actividad, que será la responsable de visualizar esta vista. Para ello crea el fichero AcercaDeActivity.java, pulsando con el botón derecho sobre el nombre del paquete de la aplicación y seleccionando New > Java Class. En el campo Name introduce AcercaDeActivity y pulsa Finish. Reemplaza el código por:

public class AcercaDeActivity extends Activity {

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.acercade);
    }
} 
class AcercaDeActivity : Activity() {
   public override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.acercade)
   }
} 

 Nota sobre Java/Kotlin: Pulsa Alt-Intro  en las dos clases modificadas para que automáticamente se añadan los paquetes que faltan.

4. Pasemos ahora a crear un método en la actividad principal que será ejecutado cuando sea pulsado el botón Acerca de.  

public void lanzarAcercaDe(View view){
   Intent i = new Intent(this, AcercaDeActivity.class);
   startActivity(i);
} 
fun lanzarAcercaDe(view: View? = null) {
    val i = Intent(this, AcercaDeActivity::class.java)
    startActivity(i)
} 

5. Para asociar este método al botón edita el Layout content_main.xml (o content_main.xml en Mis Lugares). Selecciona la lengüeta Design y pulsa sobre el botón Acerca de… y en la vista Properties  busca el atributo onClick e introduce el valor lanzarAcercaDe.

6. Selecciona la lengüeta Text y observa como, en la etiqueta <Button> correspondiente, se ha añadido el atributo:

android:onClick="lanzarAcercaDe"

NOTA: En caso de que exista algún recurso alternativo para el layout repite el mismo proceso. 

7. Ejecuta ahora la aplicación y pulsa en el botón Acerca de. Observarás que el resultado no es satisfactorio ¿Qué ha ocurrido?

El problema es que toda actividad que ha de ser lanzada por una aplicación ha de ser registrada en el fichero AndroidManifest.xml. Para registrar la actividad, abre AndroidManifest.xml. Añade el siguiente texto dentro de la etiqueta <application …> </ application>:

<activity android:name=".AcercaDeActivity"
          android:label="Acerca de ..."/>

8. Ejecuta de nuevo el programa. El resultado ha de ser similar al mostrado a continuación:

La vista mostrada en el ejemplo anterior no parece muy atractiva. Tratemos de mejorarla aplicando un tema. Como vimos en el capítulo anterior, un tema es una colección de estilos que define el aspecto de una activad o aplicación. Puedes utilizar alguno de los temas disponibles en Android o crear el tuyo propio.

9. En este caso utilizaremos uno de los de Android. Para ello abre AndroidManifest.xml e introduce la línea subrayada:

<activity android:name=".AcercaDeActivity"
          android:label="Acerca de ..."
          android:theme="@style/Theme.AppCompat.Light.Dialog"/> 

10. Ejecuta de nuevo el programa y observa cómo la apariencia mejora:

Ejercicio: Un escuchador de evento por código

Como acabamos de ver en un layout podemos definir el atributo XML android:onClick que nos permite indicar un método que será ejecutado al hacer click en una vista. A este método se le conoce como escuchador de evento. Resulta muy sencillo y además está disponible en cualquier descendiente de la clase View. Sin embargo esta técnica presenta dos inconvenientes. Solo está disponible para el evento onClick(). La clase View tiene otros eventos (onLongClick(), onFocusChange(), onKey(),…) para los que no se han definido un atributo xml. Entonces, ¿qué hacemos si queremos definir un evento distinto de onClick(). La respuesta la encontrarás este ejercicio:

1. Abre la clase MainActivity, y añade las líneas que aparecen subrayadas:

public class MainActivity extends Activity {
    private Button bAcercaDe;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bAcercaDe = findViewById(R.id.button03);
        bAcercaDe.setOnClickListener(new OnClickListener() {
              public void onClick(View view) {
                 lanzarAcercaDe(null);
              }
        });
    }
    … 
class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      button03.setOnClickListener{
         lanzarAcercaDe()
      }

Nota sobre Java: Pulsa Alt-Intro  para que automáticamente se añadan los imports que faltan. Para la clase OnClickListener selecciona android.view.View.OnClickListener.

2. Elimina el atributo añadido al botón:

android:onClick="lanzarAcercaDe" 

3. Ejecuta la aplicación. El resultado ha de ser identico al anterior.

NOTA:  Más adelante se estudiará con más detalle los escuchadores de evento.

Práctica: El botón salir

En el layout activity_main.xml (o content_main.xml en Mis Lugares) hemos introducido un botón con texto “Salir”.  Queremos que cuando se pulse este botón se cierre la actividad. Para cerrar una actividad puedes llamar al método   finish(); Llamar a este método es equivalente a cuando un usuario pulsa la tecla «retorno».

1. Realiza este trabajo utilizando un escuchador de evento por código.

2. Hazlo ahora con el atributo xml android:onClick.

3. Verifica que el resultado es el mismo en ambos casos.

NOTA: No esconveniente que en tus actividades incluyas un botón para cerrarlas. Un dispositivo Android siempre dispone de la tecla «retorno», que tiene la misma función. 

Solución:

1.     Para resolverlo mediante un escuchador por código, añade en el método onCreate() de la clase MainActivity el siguiente código:

Button bSalir = findViewById(R.id.button04);
bSalir.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        finish();
    }
}); 
Button04.setOnClickListener{
   finish()
} 

2.     Para resolverlo con el atributo onClick, añade en MainActivity el método:

public void salir(View view){
    finish();
} 
fun salir(view: View?) {
    finish();
} 

Y añade el siguiente atributo al botón “Salir” en el layout activity_main.xml:

android:onClick="salir" 

Preguntas de repaso: Actividades