Iniciando otra actividad

Tras completar la última lección deberías tener una aplicación que muestra una actividad (una pantalla única) con una caja de texto y un botón. En esta lección, añadiremos algo de código a MainActivity para iniciar una nueva actividad cuando el usuario haga clic sobre el botón Enviar.

Responder al botón Enviar


Para responder al evento on-click (al pulsar) del botón, abre el archivo de interfaz de usuario activity_main.xml y añade el atributo android:onClick al elemento <Button>:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

El valor del atributo android:onClick, "sendMessage", es el nombre de un método en tu actividad que el sistema llamará cuando el usuario pulse sobre el botón.

Abre la clase MainActivity (situada en el directorio src/ de tu proyecto) y añade el método correspondiente:

/** Llamado cuando el usuario hace clic en el botón Enviar */
public void sendMessage(View view) {
    // Haz algo en respuesta al botón
}

Esto requiere que importes la clase View:

import android.view.View;

Consejo: En Eclipse, presiona las teclas Ctrl + Mayúsculas + O para importar clases faltantes (Cmd + Mayúsculas + O en Mac).

Para que el sistema asocie este método al nombre del método dado en android:onClick, la declaración debe ser exactamente como se muestra. Especificamente, el método debe:

  • Ser público
  • Tener un valor de retorno void
  • Tener un objeto View como único parámetro (este será el elemento View sobre el que se ha pulsado)

A continuación, escribiremos el código necesario para leer el contenido del campo de texto y mandar este texto a otra actividad.

Crear un Intent


Un Intent (intención) es un objeto que proporciona un enlace en tiempo de ejecución entre componentes separados (como dos actividades). El Intent representa la "intención de hacer algo" por parte de la aplicación. Puedes usar intenciones para una amplia variedad de tareas, pero su uso más habitual es el de iniciar otra actividad.

Dentro del método sendMessage(), crea un Intent para iniciar una actividad llamada DisplayMessageActivity:

Intent intent = new Intent(this, DisplayMessageActivity.class);

El constructor utilizado tiene dos parámetros:

  • Un Context (contexto) como primer parámetro (se utiliza this porque la clase Activity es una subclase de Context)
  • La clase (Class) del componente de la aplicación al que el sistema debería enviar el Intent (en este caso, la actividad que debería iniciarse)

Nota: La referencia a DisplayMessageActivity provocará un error si estás utilizando un IDE, como Eclipse, porque la clase no existe todavía. Ignora este error por ahora; crearemos la clase en breve.

Una intención no solo permite iniciar otra actividad, sino que también puede pasar un bundle (lote) de datos a esta actividad. Dentro del método sendMessage(), usa findViewById() para obtener el elemento EditText y añade su valor a la intención:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

Nota: Ahora necesitas añadir una sentencia import para android.content.Intent y android.widget.EditText. Definiremos la constante EXTRA_MESSAGE en un momento.

Un Intent puede transportar una colección de varios tipos de datos en forma de pares clave-valor llamados extras. El método putExtra() toma el nombre de la clave como primer parámetro y el valor como segundo parámetro.

Para que la siguiente actividad consulte los datos extra, deberías definir la clave para los datos extra de tu intención usando una constante pública. Añade la definición de EXTRA_MESSAGE en la parte superior de la clase MainActivity:

public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}

Generalmente es una buena práctica definir claves para los datos extra de las intenciones utilizando el nombre del paquete de tu aplicación como prefijo. Esto nos asegura que sean únicas, para el caso de que tu aplicación interaccione con otras aplicaciones.

Iniciar la segunda actividad


Para iniciar una actividad, llama a startActivity() pasándole tu Intent. El sistema recibe esta llamada e inicia una instancia de la Activity especificada por el Intent.

Con este nuevo código, hemos completado el método sendMessage() que invocará el botón Enviar, y que ahora tiene este aspecto:

/** Llamado cuando el usuario pulsa en el botón Enviar */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Para que esto funcione ahora tenemos que crear la clase DisplayMessageActivity.

Crear la segunda actividad


Figura 1. El asistente de nueva actividad en Eclipse.

Para crear una nueva actividad usando Eclipse:

  1. Clic en el botón New de la barra de herramientas.
  2. En la ventana que aparece, abre la carpeta Android y selecciona Android Activity (Actividad Android). Haz clic en Next.
  3. Selecciona BlankActivity y haz clic en Next.
  4. Introduce los detalles de la actividad:
    • Project: MyFirstApp
    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchial Parent: com.example.myfirstapp.MainActivity
    • Navigation Type: None

    Clic en Finish.

Si estás utilizando otro IDE o herramientas de línea de comandos, crea un nuevo archivo llamado DisplayMessageActivity.java en el directorio src/ del proyecto, junto al archivo MainActivity.java original.

Abre el archivo DisplayMessageActivity.java. Si utilizaste Eclipse para crear esta actividad:

  • La clase ya incluirá una implementación del método onCreate() requerido.
  • También habrá una implementación del método onCreateOptionsMenu(), pero no lo necesitaremos para esta aplicación así que puedes borrarlo.
  • También habrá una implementación de onOptionsItemSelected() el cuál maneja el comportamiento de la opción de Subir de la action bar (barra de acciones). Puedes dejarlo tal y como está.

Como las APIs de la ActionBar sólo están disponibles en HONEYCOMB (nivel API 11) y superior, debes añadir una condición alrededor del método getActionBar() para comprobar la versión actual de la plataforma. Además, debes añadir la etiqueta @SuppressLint("NewApi") al método onCreate() para evitar los errores de lint.

La clase DisplayMessageActivity debería tener este aspecto una vez hechos estos cambios:

public class DisplayMessageActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);

        // Comprobamos si es Honeycomb o superior para usar las APIs ActionBar
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Muestra el botón Subir en la barra de acciones.
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Si usas un IDE distinto de Eclipse, actualiza tu clase DisplayMessageActivity con este código.

Todas las subclases de Activity deben implementar el método onCreate(). El sistema llama a este método cuando se está creando una nueva instancia de la actividad. En este método es donde deberás definir la interfaz de usuario de la actividad con el método setContentView() y es donde deberías llevar a cabo la configuración inicial de los componentes de la actividad.

Nota: Si estás usando un IDE distinto de Eclipse, tu proyecto no incluirá el archivo de interfaz de usuario activity_display_message usada por setContentView(). No pasa nada porque actualizaremos este método más adelante y no usaremos este diseño.

Añadir la cadena de título

Si usas Eclipse, puedes saltar directamente a la próxima sección, porque la plantilla ya proporciona una cadena de título para la nueva actividad.

Si usas un IDE distinto de Eclipse, añade el título de la nueva actividad al archivo strings.xml:

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

Añadirla al manifiesto

Todas las actividades deben estar declaradas en tu archivo de manifiesto, AndroidManifest.xml, usando un elemento <activity>.

Cuando usas las herramientas de Eclipse para crear la actividad, este crea una entrada por defecto. Si usas otro IDE, necesitarás añadir la entrada de manifiesto tú mismo. Debería tener este aspecto:

<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

El atributo android:parentActivityName declara el nombre de la actividad padre de esta actividad en la jerarquía lógica de la aplicación. El sistema utiliza este valor para implementar los comportamientos de navegación por defecto, como la navegación hacia arriba en Android 4.1 (nivel API 16) y superior. Puedes proporcionar los mismos comportamientos de navegación para versiones antiguas de Android usando la Librería de soporte y añadiendo el elemento <meta-data> tal como se muestra aquí.

Nota: Tu copia del SDK de Android ya debería incluir la última versión de la Librería de Soporte de Android. Viene incluida junto a Eclipse y el plugin ADT, pero si usas un IDE distinto, deberías haberla instalado en el paso Añadiendo Plataformas y Paquetes. Cuando usas las plantillas de Eclipse, la Librería de Soporte se añade automáticamente a tu proyecto (puedes ver el archivo JAR de la librería en Android Dependencies o Dependencias Android). Si no usas Eclipse, tendrás que añadir la librería a tu proyecto manualmente—sigue la guía Configurando la Librería de Soporte y vuelve a esta lección cuando termines.

Si estás desarrollando con Eclipse, ya puedes ejecutar la aplicación, aunque no ocurrirá gran cosa. Al pulsar en el botón Enviar se iniciará la segunda actividad pero todavía utiliza la interfaz por defecto del "Hola mundo" que proporciona la plantilla. En seguida actualizaremos la actividad para mostrar una vista de texto personalizada en su lugar, por lo que si usas un IDE distinto, no te preocupes porque tu aplicación no compile todavía.

Recibir el Intent


Toda Activity es invocada por un Intent, independientemente de cómo haya llegado a ella el usuario. Puedes obtener el Intent que inicio tu actividad llamando a getIntent() y obtener los datos que este contiene.

En el método onCreate() de la clase DisplayMessageActivity, obtén la intención y extrae el mensaje mandado por MainActivity:

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Mostrar el mensaje


Para mostrar el mensaje en la pantalla, crea un control TextView y establece el texto usando setText(). Después añade el TextView como vista raíz del diseño de la actividad pasándolo a setContentView().

Una vez terminado el método onCreate() de DisplayMessageActivity tiene este aspecto:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Obtenemos el mensaje de la intención
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Creamos la vista de texto
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Establecemos la vista de texto como interfaz de usuario de la actividad
    setContentView(textView);
}

Ahora puedes ejecutar la aplicación. Cuando se inicie, escribe un mensaje en el campo de texto, haz clic en Enviar, y el mensaje aparecerá en la segunda actividad.

Figura 2. Ambas actividades en la aplicación final, corriendo en Android 4.0.

Eso es todo, ¡has construido tu primera aplicación Android!

Para aprender más sobre el desarrollo de aplicaciones Android, continúa con el resto de las clases de aprendizaje. La siguiente clase es Gestionando el ciclo de vida de la actividad.