Tras completar la lección anterior, tienes una app que muestra una actividad (una única pantalla) con un campo de texto y un botón. En esta lección, añadirás algo de código a tu actividad MyActivity
para que puedas iniciar otra actividad cuando el usuario presione en el botón Send
.
Contenidos
Respuesta del Botón Send
- En Android Studio, desde el directorio
res/layout directory
, edita el archivoactivity_my.xml
. - En el elemento <Button>, añade el atributo
android:onClick
.<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 dentro de tu actividad que el sistema utilizará cuando el usuario presione el botón. - En el directorio
java/com.mycompany.myfirstapp
, abre el archivoMyActivity.java
. - Dentro de la clase
MyActivity
, añade el métodosendMessage()
como se muestra abajo:/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
Para que el sistema pueda encontrar este método, tiene que cumplir lo siguiente:
- Ser público
- La instrucción
return
tiene que devolver un valorvoid
. - Tener una
View
como único parámetro (esta será laView
que se presionará)
A continuación, completarás este método para que lea el contenido del campo de texto y lo envíe a otra actividad.
Crear una Intención
- En
MyActivity.java
, dentro del métodosendMessage()
, crea una Intención (Intent) para iniciar otra actividad que se llamaráDisplayMessageActivity
con el siguiente código:public void sendMessage(View view) { Intent intent = new Intent(this, DisplayMessageActivity.class); }
Nota: La referencia
DisplayMessageActivity
mostrará un error si estás utilizando un IDE de la índole de Android Studio ya que la clase aún no ha sido creada. Ignora este error por ahora; la clase la crearás pronto.Intenciones (Intents)
Un
Intent
es un objeto que proporciona una unión entre dos componentes que se encuentran separados, como dos actividades. ElIntent
representa la “intención de hacer algo” de una app”. Puedes utilizar intenciones para una gran variedad de tareas, pero la más habitual es iniciar otra actividad. Para más información, visita Intenciones y Filtro de Intenciones. - En la parte superior del archivo, importa la clase
Intent
.import android.content.Intent;
Consejo: En Android Studio, presiona Alt + enter (option + return en Mac) para importar las clases que falten.
- Dentro del método
sendMessage()
, utilizafindViewById()
para buscar el elementoEditText
.public void sendMessage(View view) { Intent intent = new Intent(this, DisplayMessageActivity.class); EditText editText = (EditText) findViewById(R.id.edit_message); }
- En la parte superior del archivo, importa la clase
EditText
. En Android Studio, presiona Alt + enter (option + return en Mac) para importar las clases que falten. - Asigna el texto a una variable llamada
message
y utiliza el métodoputExtra()
para añadir este texto a la intención.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); }
Un
Intent
puede transmitir pares de datos llamados extras. El métodoputExtra()
añade al primer parámetro el nombre clave o al que haremos referencia, y el valor que queremos que tenga ese nombre clave se coloca en el segundo parámetro. - En la parte superior de la clase
MyActivity
, añade la siguiente definiciónEXTRA_MESSAGE
:public class MyActivity extends AppCompatActivity{ public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE"; ... }
En la siguiente actividad, a la hora de consultar estos datos, debe definir una clave extra para la intención con una constante pública. También es una buena práctica definir las claves para los extras de las intenciones utilizando el nombre del paquete de la app. Así te aseguras que tu clave es única, en caso de que tu app interactúe con otras apps.
- En el método
sendMessage()
llama al botónSend
del siguiente modo:/** Called when the user clicks the Send button */ 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); }
El sistema recibe esta llamada e inicia una instancia de la
Activity
especificada en elIntent
. Ahora necesitas crear la claseDisplayMessageActivity
para que funcione este método.
Crear una Segunda Actividad
Todas las subclases de Activity
deben implementar el método onCreate()
. Este método es el lugar donde la actividad recibirá la intención con el mensaje, para posteriormente mostrarlo. También, en el método onCreate()
se debe definir el layout de la actividad mediante el método setContentView()
. Aquí es donde se configura todos los componentes de la actividad.
Crear una nueva actividad usando Android Studio
Android Studio incluye el método onCreate()
entre otros cuando creas una nueva actividad.
- En Android Studio,. en el directorio java, selecciona el paquete, com.mycompany.myfirstapp, haz clic derecho y selecciona New > Blank Activity.
- En la ventana Choose options, rellena los detalles de la actividad:
- Activity Name (Nombre de la actividad): DisplayMessageActivity
- Layout Name (Nombre del layout asociado a la actividad): activity_display_message
- Title (Título): My Message
- Hierarchical Parent (Padre jerárquico): com.mycompany.myfirstapp
- Package name (Nombre del paquete): com.mycompany.myfirstapp
- Clic en Finish.
- Abre el archivo
DisplayMessageActivity.java
. La clase ya incluye una implementación del método onCreate(). onOptionsItemSelected(), el cual se encarga del comportamiento de Atrás y Subir la Action Bar. Deja estos dos métodos como están por ahora. - Elimina el método
onCreateOptionsMenu()
. No lo necesitarás para esta app.
Si estás desarrollando utilizando Android Studio, puedes ejecutar tu app ya, pero no ocurrirán demasiadas cosas. Presionar el botón Send
inicia la segunda actividad, pero esta utiliza el layout por defecto que muestra “Hello world”. Pronto actualizarás la actividad para mostrar un TextView
personalizado.
Crear la actividad sin Android Studio
Si estás utilizando un IDE diferente o la línea de comandos, sigue los siguientes pasos:
- Crea un nuevo archivo llamado
DisplayMessageActivity.java
en el directorio del proyectosrc/
junto a archivo de la primera actividadMyActivity.java
. - Añade el siguiente código al archivo:
public class DisplayMessageActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_display_message, container, false); return rootView; } } }
Nota: Si estás utilizando un IDE diferente a Android Studio, tu proyecto no contiene el layout
activity_display_message
que requiere el métodosetContentView()
anterior. Actualizarás esto más adelante para solucionarlo. - Añade el título de tu actividad a tu archivo
string.xml
:<resources> ... <string name="title_activity_display_message">My Message</string> </resources>
- En tu archivo manifest,
AndroidManifest.xml
, dentro de el elementoApplication
, añade el elemento<Activity>
para tu claseDisplayMessageActivity
:<application ... > ... <activity android:name="com.mycompany.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.mycompany.myfirstapp.MyActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.mycompany.myfirstapp.MyActivity" /> </activity> </application>
El atributo
android:parentActivityName
declara el nombre de la actividad padre de la segunda actividad dentro de la jerarquía de la app. El sistema utiliza este valor para implementar algunos comportamientos de navegación por defecto, como la Navegación Subir en Android 4.1 (API 16) o superior. Puedes proporcionar estos comportamientos de navegación para versiones anteriores de Android utilizando la Librería de Soporte (Support Library) gracias al elemento<meta-data>
como se muestra en el código anterior.
Nota: Tu SDK Android debería tener incluido la última Librería de Soporte Android (Android Support Library), la cual instalaste en el paso Añadir Paquetes del SDK. Cuando utilices las plantillas de Android Studio, la librería de soporte se añade automáticamente a tu proyecto (puedes ver el archivo
JAR
bajo Android Dependencies (Dependencias de Android). Si no estás utilizando Android Studio, necesitas añadir manualmente esta librería a tu proyecto mediante la siguiente guía, Configurar la Librería de Soporte, después vuelve a esta lección.
Si estás utilizando un IDE diferente a Android, no te preocupes si tu app no compila aún. Pronto actualizarás la actividad para que muestre un TextView
personalizado.
Recibir la Intención
Cada Activity
es llamada por un Intent
, independientemente de como el usuario haya navegado hasta ahí. Puedes recuperar el Intent
que inició la actividad mediante el método getIntent()
y recuperar los datos que contiene dicha intención.
- En el directorio
java/com.mycompany.myfirstapp
, edita el archivoDisplayMessageActivity.java
. - En el método
onCreate()
, elimina la siguiente línea:setContentView(R.layout.activity_display_message);
- Recupera la intención y después dale su valor a una variable.
Intent intent = getIntent();
- En la parte superior del archivo, importa la clase
Intent
.En Android Studio, presiona Alt + Enter (option + return en Mac) para importar las clases que falten. - Extrae el mensaje enviado por
MyActivity
con el métodogetStringExtra()
.String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
Mostrar el Mensaje
- En el método
onCreate()
, crea un objetoTextView
.TextView textView = new TextView(this);
- Cambia el tamaño del texto y el mensaje mediante el método
setText()
.textView.setTextSize(40); textView.setText(message);
- Añade el
TextView
a la vista raiz del layout de tu actividad mediante el métodosetContentView()
.setContentView(textView);
- En la parte superior del archivo, importa la clase
TextView
.En Android Studio, presiona Alt + Enter (options + return en Mac) para importar las clases que faltan.
El código completo para el método onCreate()
para la actividad DisplayMessageActivity es el siguiente:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the message from the intent Intent intent = getIntent(); String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE); // Create the text view TextView textView = new TextView(this); textView.setTextSize(40); textView.setText(message); // Set the text view as the activity layout setContentView(textView); }
Ahora puedes ejecutar tu app. Cuando se abra, escribe un mensaje en el campo de texto, presiona Send
, y el mensaje aparecerá en la segunda actividad.
¡Eso es todo, ya has completado tu primera app Android!
Para aprender más visita la siguiente clase.
Puedes ver más información sobre Iniciar otra Actividad en la página oficial de Google en inglés pulsando aquí.