Cómo iniciar otra actividad

Luego de completar la lección anterior, tendrás una app que muestra una actividad (una sola pantalla) con un campo de texto y un botón. En esta lección, aprenderás a agregar código a la MainActivity para que se inicie una nueva actividad que permita mostrar el mensaje cuando el usuario presione Enviar.

Nota: En esta lección, se asume que estás usando Android Studio 3.0 o versiones posteriores.

Cómo responder al botón Enviar

Sigue estos pasos y agrega un método a la clase MainActivity que llama el botón:

  1. En el archivo app > java > com.example.myfirstapp > MainActivity, agrega el método auxiliar sendMessage(), como se muestra debajo:

    Kotlin

        class MainActivity : AppCompatActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
            }
    
            /** Called when the user taps the Send button */
            fun sendMessage(view: View) {
                // Do something in response to button
            }
        }
        

    Java

        public class MainActivity extends AppCompatActivity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            }
    
            /** Called when the user taps the Send button */
            public void sendMessage(View view) {
                // Do something in response to button
            }
        }
        

    Es posible que veas un error porque Android Studio no puede resolver la clase View que se usa como argumento del método. Por lo tanto, haz clic para posicionar tu cursor en la declaración View y, luego, realiza una corrección rápida con Alt + Intro (en Mac, Option + Intro). (Si aparece un menú, selecciona Importar clase).

  2. Vuelve al archivo activity_main.xml para llamar a este método desde el botón:
    1. Haz clic para seleccionar el botón en el editor de diseño.
    2. En la ventana Atributos, ubica la propiedad onClick y selecciona sendMessage [MainActivity] en la lista desplegable.

De esta manera, cuando se presione el botón, el sistema llamará al método sendMessage().

Toma nota de los detalles de este método que se requieren para que el sistema lo reconozca como compatible con el atributo android:onClick. Específicamente, el método tiene las siguientes características:

  • Acceso público
  • Un valor de retorno de unidad vacío o, en Kotlin, implícito
  • Un View como único parámetro (es el objeto View en el que se hizo clic)

A continuación, deberás completar este método para leer el contenido del campo de texto y proporcionar dicho texto a otra actividad.

Cómo crear un intent

Un Intent es un objeto que proporciona vinculación en tiempo de ejecución entre componentes separados, como dos actividades. El Intent representa la "intención de realizar una acción" de una app. Pueden usarse para una gran variedad de tareas, pero en esta lección, tu intent iniciará otra actividad.

En MainActivity, agrega la constante EXTRA_MESSAGE y el código sendMessage(), como se muestra a continuación:

Kotlin

    const val EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }

        /** Called when the user taps the Send button */
        fun sendMessage(view: View) {
            val editText = findViewById<EditText>(R.id.editText)
            val message = editText.text.toString()
            val intent = Intent(this, DisplayMessageActivity::class.java).apply {
                putExtra(EXTRA_MESSAGE, message)
            }
            startActivity(intent)
        }
    }
    

Java

    public class MainActivity extends AppCompatActivity {
        public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        /** Called when the user taps the Send button */
        public void sendMessage(View view) {
            Intent intent = new Intent(this, DisplayMessageActivity.class);
            EditText editText = (EditText) findViewById(R.id.editText);
            String message = editText.getText().toString();
            intent.putExtra(EXTRA_MESSAGE, message);
            startActivity(intent);
        }
    }
    

Android Studio volverá a mostrar los errores No se puede resolver el símbolo, así que presiona Alt + Intro (en Mac, Option + Return). Tus importaciones deben tener el siguiente aspecto final:

Kotlin

    import android.content.Intent
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import android.widget.EditText
    

Java

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    

Verás que aún aparece un error para DisplayMessageActivity, pero no te preocupes, lo corregiremos en la siguiente sección.

Lo que sucede en sendMessage() es lo siguiente:

  • El constructor de Intent toma dos parámetros:
    • Un Context como primer parámetro (se usa this porque la clase Activity es una subclase de Context).
    • La Class del componente de la app a la cual el sistema debe entregar el Intent (en este caso, la actividad que se debe iniciar).
  • El método putExtra() agrega el valor EditText en el intent. Un Intent puede transportar tipos de datos como pares clave-valor llamados extras. Tu clave es una constante pública EXTRA_MESSAGE porque la actividad siguiente usa la clave para obtener el valor de texto. Te recomendamos definir las claves para extras de intents usando el nombre del paquete de la app como prefijo. De esta manera, se garantiza que las claves sean únicas, en el caso de que tu app interactúe con otras apps.
  • El método startActivity() inicia una instancia de la DisplayMessageActivity que especificó el Intent. Ahora deberás crear esa clase.

El componente de la arquitectura de navegación, que actualmente está en versión Alfa, te permite usar el editor de navegación para asociar una actividad con otra. Una vez que se establezca la relación, podrás usar la API para iniciar una segunda actividad cuando el usuario active la acción asociada (es decir, al hacer clic en un botón). Para obtener más información, consulta El componente de la arquitectura de navegación.

Cómo crear la segunda actividad

  1. En la ventana Proyecto, haz clic con el botón derecho en la carpeta de la app y selecciona Nuevo > Actividad > Actividad vacía.
  2. En la ventana Configurar actividad, ingresa "DisplayMessageActivity" en Nombre de la actividad y haz clic en Finalizar (deja todas las demás propiedades en sus valores predeterminados).

Android Studio realiza tres acciones automáticamente:

  • Crea el archivo DisplayMessageActivity.
  • Crea el archivo de diseño activity_display_message.xml correspondiente.
  • Agrega el elemento <activity> correspondiente en AndroidManifest.xml.

Si ejecutas la app y presionas el botón en la primera actividad, se iniciará la segunda, pero estará vacía porque usa el diseño vacío proporcionado por la plantilla.

Cómo agregar una vista de texto

Figura 1: La vista de texto centrada en la parte superior del diseño

La nueva actividad incluye un archivo de diseño en blanco, por lo tanto, deberás agregar una vista de texto en donde aparecerá el mensaje.

  1. Abre el archivo app > res > diseño > activity_display_message.xml.
  2. Haz clic en Activar conexión automática  en la barra de herramientas (luego, deberías activarla como se muestra en la figura 1).
  3. En la ventana Paleta, haz clic en Texto y, luego, arrastra una TextView al diseño. Suéltala cerca de la parte central superior del diseño de manera que se acople a la línea vertical que aparecerá. La opción de conexión automática agrega restricciones a la derecha y a la izquierda para ubicar la vista en el centro horizontal.
  4. Crea una restricción más desde la parte superior de la vista de texto hasta la parte superior del diseño para que se vea como en la figura 1.

Como alternativa, puedes realizar algunas modificaciones en el estilo de texto si expandes textAppearance en la ventana Atributos y cambias atributos como textSize y textColor.

Cómo mostrar el mensaje

A continuación, deberás modificar la segunda actividad para que muestre el mensaje que transfirió la primera.

  1. En DisplayMessageActivity, agrega el siguiente código al método onCreate():

    Kotlin

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_display_message)
            
            // Get the Intent that started this activity and extract the string
            val message = intent.getStringExtra(EXTRA_MESSAGE)
    
            // Capture the layout's TextView and set the string as its text
            val textView = findViewById<TextView>(R.id.textView).apply {
                text = message
            }
        }
        

    Java

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_display_message);
            
            // Get the Intent that started this activity and extract the string
            Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    
            // Capture the layout's TextView and set the string as its text
            TextView textView = findViewById(R.id.textView);
            textView.setText(message);
        }
        
  2. Presiona Alt + Intro (en Mac, Option + Return) para importar las clases faltantes. Tus importaciones deben tener el siguiente aspecto final:

    Kotlin

        import android.content.Intent
        import android.support.v7.app.AppCompatActivity
        import android.os.Bundle
        import android.widget.TextView
        

    Java

        import android.content.Intent;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.widget.TextView;
        

Cómo agregar navegación superior

En cada pantalla de tu app que no sea el punto de entrada principal (todas las pantallas que no sean la "pantalla principal") se debe proporcionar navegación para que el usuario pueda regresar a la pantalla superior lógica en la jerarquía de la app cuando presione el botón para navegar hacia arriba en la barra de app.

Lo único que debes hacer es declarar qué actividad es la actividad superior lógica en el archivo AndroidManifest.xml. Así que abre el archivo en app > manifiestos > AndroidManifest.xml, ubica la etiqueta <activity> para DisplayMessageActivity y reemplázala por lo siguiente:

    <activity android:name=".DisplayMessageActivity"
              android:parentActivityName=".MainActivity">
        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    

El sistema Android agregará automáticamente el botón hacia arriba en la barra de app.

Cómo ejecutar la app

Ahora vuelve a ejecutar la app haciendo clic en Aplicar cambios  en la barra de herramientas. Cuando se abra, escribe un mensaje en el campo de texto y presiona Enviar para que el mensaje aparezca en la segunda actividad.

Figura 2: Capturas de pantalla de ambas actividades

Eso es todo. Compilaste tu primera app para Android

Para seguir aprendiendo los aspectos básicos del desarrollo de apps para Android, sigue los otros vínculos disponibles en la portada de este instructivo.