Cómo iniciar otra actividad

Después de completar la lección anterior, tendrás una app que mostrará una actividad (una única pantalla) con un campo de texto y un botón. En esta lección, agregarás a MainActivity un fragmento de código que iniciará una nueva actividad para mostrar el mensaje cuando el usuario presione Send.

Nota: En esta lección, se presupone que usas Android Studio 3.0 o una versión posterior.

Cómo responder al botón Send

Agrega un método en la clase MainActivity que sea invocado por el botón de la siguiente manera:

  1. En el archivo app > java > com.example.myfirstapp > MainActivity.java, agrega el código auxiliar del método sendMessage() como se muestra a continuación:

    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, ya que 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 presionando Alt + Intro (en Mac, Option + Intro). (Si aparece un menú, selecciona Import class).

  2. Regresa al archivo activity_main.xml para invocar 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 Attributes, encuentra la propiedad onClick y selecciona sendMessage [MainActivity] en la lista desplegable.

Ahora, cuando se presione el botón, el sistema invocará 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, este método tiene las siguientes características:

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

Luego, completarás 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 enlace de tiempo de ejecución entre componentes separados, como dos actividades. El Intent representa la "intención de hacer algo" de una app. Puedes usar los intents para varias 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 nuevamente mostrará los errores Cannot resolve symbol. 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;

Queda un error para DisplayMessageActivity, pero no hay inconveniente; podrás corregirlo en la sección siguiente.

Esto es lo que sucede en sendMessage():

  • El constructor de Intent toma dos parámetros:
    • Un elemento Context como su primer parámetro (se usa this porque la clase Activity es una subclase de Context).
    • El elemento Class del componente de la app a la que el sistema debe entregar el Intent (en este caso, la actividad que debe iniciarse).
  • El método putExtra() agrega el valor de EditText al intent. Un Intent puede llevar tipos de datos como pares clave-valor denominados extras. Tu clave es una constante pública EXTRA_MESSAGE porque la actividad siguiente usa la clave para obtener el valor de texto. Se recomienda definir claves para los extras de intents usando el nombre del paquete de tu app como prefijo. Esto garantiza que las claves sean únicas, en el caso de que tu app interactúe con otras.
  • El método startActivity() inicia una instancia del elemento DisplayMessageActivity especificado por el Intent. Ahora deberás crear esa clase.

El Componente de arquitectura de navegación, actualmente en Alfa, te permite utilizar el Editor de navegación para asociar una actividad con otra. Una vez establecida la relación, puedes utilizar la API para iniciar la segunda actividad cuando el usuario active la acción asociada (es decir, haciendo clic en un botón). Para más información, consulta el Componente de arquitectura de navegación.

Cómo crear la segunda actividad

  1. En la ventana Project, haz clic con el botón derecho en la carpeta app y selecciona New > Activity > Empty Activity.
  2. En la ventana Configure Activity, ingresa "DisplayMessageActivity" en Activity Name y haz clic en Finish (deja todas las demás propiedades con 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> obligatorio en AndroidManifest.xml.

Si ejecutas la app y presionas el botón en la primera actividad, se iniciará la segunda, pero estará vacía. Esto sucede porque la segunda actividad 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 actividad nueva incluye un archivo de diseño en blanco, por lo que ahora agregarás una vista de texto en la que aparecerá el mensaje.

  1. Abre el archivo app > res > layout > activity_display_message.xml.
  2. En la barra de herramientas, haz clic en Turn On Autoconnect (luego debe habilitarse, como se muestra en la figura 1).
  3. En la ventana Pallete, haz clic en Text y luego arrastra un TextView hacia el diseño, en un punto cercano al centro para que se acople a la línea vertical que aparece. La opción "Autoconnect" 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 tenga el aspecto de la figura 1.

Como alternativa, puedes realizar algunas modificaciones en el estilo de texto expandiendo textAppearance en la ventana Attributes y cambiar atributos como textSize y textColor.

Cómo mostrar el mensaje

A continuación, modificarás 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 la entrada principal (todas las pantallas que no sean la de inicio), se debe proporcionar navegación. De esta forma, el usuario puede regresar a la pantalla primaria lógica en la jerarquía de apps presionando el botón Up en la barra de apps.

Lo único que debes hacer es declarar la actividad primaria lógica en el archivo AndroidManifest.xml. Para ello, abre el archivo en app > manifests > 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 de Android agregará automáticamente el botón Up en la barra de apps.

Cómo ejecutar la app

Ahora ejecuta nuevamente la app haciendo clic en Apply Changes , en la barra de herramientas. Cuando se abra, escribe un mensaje en el campo de texto y presiona Send para que el mensaje aparezca en la segunda actividad.

Figura 2: Capturas de pantalla de ambas actividades

Eso es todo. ¡Has compilado tu primera app de Android!

Para continuar aprendiendo los conceptos básicos sobre el desarrollo de apps para Android, sigue los demás vínculos que se ofrecen en la página principal de este instructivo.