Lanzar una nueva Activity en Android

Buenas, en esta entrada seguiremos con nuestro tutorial sobre Android, continuando con el anterior que publiqué, en el cual disponíamos una interfaz gráfica de usuario bastante simple, pero para lo que queremos ahora mismo, nos va bien.


Al terminar la anterior lección, teníamos una aplicación con un campo de texto, donde podíamos introducir texto, y un botón para enviar ese texto, pero sin embargo este último aunque pulsaramos no hacía nada. En esta lección le daremos una utilidad a ese botón, creando una nueva actividad y mandando el texto introducido a esta mostrandola en letras mas grandes. Así a ojo puede parecer algo sin utilidad, pero la mayoría de las aplicaciones mas complejas hacen buen uso de estos métodos.

  • Respuesta al botón Enviar

    Para generar un evento al pulsar click sobre el botón Enviar vamos a ir al XML donde lo tenemos definido y vamos a agregar el atributo android:onClick.

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

    El valor "enviarMensaje" del atributo android:onClick, es el nombre del método que en nuestra actividad llamaremos cuando pulsemos el botón.

    Ahora procedemos a abrir nuestra actividad principal, MainActivity, y añadiremos el correspondiente método.

    				/** Llamado cuando pulsamos el botón Enviar */
        			public void enviarMensaje(View view){
        				// Hace algo cuando pulsemos el botón
        			}
    				

    Para que el sistema se ajuste a este método cuyo nombre damos en android:onClick, el nombre debe ser idéntico, es decir, el valor de android:onClick debe ser exactamente igual al nombre del método en nuestro código. Especificamente, el método debe:

    • Ser public
    • Tener un valor de retorno void
    • Tener un objeto View como parámetro único

    Lo siguiente que haremos es rellenar el método para que lea el contenido del campo de texto y transporte el contenido a otra actividad.

  • Construir un Intent

    Un Intent es un objeto que provee que ataduras en tiempo de ejecución entre componentes separados (como 2 actividades). El Intent representa un “Intento de hacer algo” en la aplicación. Se pueden usar Intent para diferentes tareas, pero la mas común es la de ejecutar otra actividad.

    Dentro del método enviarMensaje(), vamos a crear un Intent para ejecutar una actividad llamada DisplayMessageActivity.

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

    El constructor que hemos usado necesita 2 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 aplicación para el cual el sistema entregará el Intent (En este caso, la actividad que va a ser lanzada).

    Ahora mismo si intentamos ejecutar la aplicación nos mostrará un error, ya que aun no tenemos la Actividad DisplayMessageActivity creada, lo ignoramos ya que lo haremos mas tarde.

    Un objeto Intent no solo sirve para comenzar una nueva actividad, sino que puede llevar consigo información a la siguiente actividad. Por lo tanto usaremos findViewById() para recoger la información del EditText y añadir este valor al Intent.

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

    Un Intent puede llevar consigo varios tipos de dato como pares key-value llamados extras. El método putExtra() coge el nombre de la clave como primer parámetro y el valor como segundo parámetro.

    Para que la siguiente actividad pueda consultar la información extra, deberíamos definir una clave usando una constante pública. Asi que ahora agregaremos la definición de EXTRA_MESSAGE en la clase MainActivity.

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

    Es buena práctica definir keys para los extras de los Intents usando el nombre del paquete como prefijo. Esto nos asegura que son únicos en el caso de que nuestra app interactúe con otras aplicaciones.

  • Comenzar la segunda Actividad

    Para lanzar una segunda actividad lo único que necesitamos es llamar al método startActivity() y pasar nuestro Intent como parámetro. El sistema recibirá la llamada y dará comienzo a una nueva instancia de la Activity especificada en el Intent.

    Con este nuevo código el método enviarMensaje() debería quedar algo así:

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

    Ahora tenemos que crear la clase DisplayMessageActivity para que esto funcione.

  • Crear la segunda Actividad

    Para crear la nueva actividad usando Eclipse seguiremos estos sencillos pasos:

    1. Pinchamos New en la barra de herramientas
    2. En la ventana que nos aparece, buscamos Android Activity y pulsamos Next
    3. Seleccionamos BlankActivity y pulsamos Next
    4. Rellenamos los detalles de la nueva actividad
      • Project: MyFirstApp
      • Activity Name: DisplayMessageActivity
      • Layout name: activity_display_message
      • Navigation Type: None
      • Hierarchiel Parent: com.example.myfirstapp.MainActivity
      • Tittle: My Message
    5. Pulsamos Finish

    Si abrimos el archivo DisplayMessageActivity.java veremos que la clase ya contiene el método onCreate() junto a la implementación del método onCreateOptionsMenu(), el cual no necesitamos para nuestra aplicación, asi que queremos lo podemos borrar. La clase debería ser así:

    		public class DisplayMessageActivity extends Activity {
    
        		@Override
        		public void onCreate(Bundle savedInstanceState) {
            		super.onCreate(savedInstanceState);
            		setContentView(R.layout.activity_display_message);
            
        		}
    
       
    		}
    		

    Todas las subclases que hereden de Activity deben implementar el método onCreate(). El sistema lo llama cuando se crea una nueva instancia de la actividad. Aquí es donde debemos definir el layout de la actividad y donde realizaremos la configuración inicial para los componentes de la actividad.

    Añadiendo la Actividad al manifest.

    Debemos declarar todas las actividades en el archivo manifest, llamado AndroidManifest.xml, usando el elemento activity.

    Cuando abrimos las herramientas de Eclipse para crear una actividad, esta crea una entrada por defecto. Debería ser algo así:

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

    El elemento declara el nombre de la actividad padre dentro de la jerarquía lógica.

    La aplicación se puede ahora ejecutar porque el Intent en la primera actividad se resuelve con la clase DisplayMessageActivity.

  • Recibiendo el Intent

    Toda actividad es invocada por un Intent, sin tener en cuenta la manera en la que el usuario ha llegado a ella. Podemos recibir el Intent que ha comenzado nuestra actividad llamando al método getIntent() y recogiendo la información que hay en el.

    En el método onCreate() de la nueva actividad, vamos a recoger el intent y extraerle el mensaje que adjuntamos en MainActivity.

    		Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    		
  • Mostrando el mensaje

    Para mostrar el mensaje en la pantalla vamos a crear un TextView y vamos a asignarle el texto usando setText(). Entonces, añadiremos el TextView como la raiz de la view del layout de la actividad pasandolo con setContentView().

    		@Override
        	public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.activity_display_message);
    	        
    	        // Recibe el mensaje del Intent
    	        Intent intent = getIntent();
    	        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    	        
    	        // Creamos el TextView
    	        TextView textView = new TextView(this);
    	        textView.setTextSize(40);
    	        textView.setText(message);
    	        
    	        //Ponemos el TextView como layout de la actividad
    	        setContentView(textView);
    	    }
    		

Ahora podemos ejecutar nuestra aplicación, en la que escribiremos algo en el campo de texto y pulsaremos enviar, lanzando así una segunda actividad con el texto que rellenamos.


Hemos dado un importante paso con esta lección, ahora sabemos como pasar datos de una actividad a otra mediante Intent y como podemos llevar datos con el a otra actividad, para tratar la información.

Hasta aquí todo, cualquier aporte o corrección es bienvenido.

Saludos!!!