domingo, 27 de mayo de 2012

Actividades y pasar parámetros entre ellas


Ahora, vamos a ver como crear varias actividades y estudiaremos cómo hacer que se pasen parámetros las unas a las otras.
El proyecto con este ejemplo está disponible, por email, comentado paso a paso: Intents y Bundles
Voy a explicar un poco por encima que hace cada archivo del proyecto:

./res/layout/main.xml

 
< ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 
 <textview android:id="@+id/textView1" 
           android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/hello" />
 
 <button android:id="@+id/button1" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/cadena1" />
 
 <button android:id="@+id/button2" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/cadena2" />
</linearlayout>
En este layout principal vamos a agregar dos botones que nos servirán para lanzar las nuevas actividades que creemos después.

./res/layout/segunda_actividad.xml

 
< ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" 
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 
 <textview android:id="@+id/textView1" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/cadena1" />
 
 <textview android:id="@+id/params" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/hello" />
 
 <button android:id="@+id/boton" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="@string/cadena1" />
 
</linearlayout>
Este layout vamos a usarlo para mostrar los parámetros que pasemos de una actividad a otra

./src/mainActivity.java

package com.msalvettitest.actividades;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class mainActivity extends Activity {
 
   protected static final int REQUEST_CODE = 10;
 
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
 
      // Capturamos los objetos gráficos que vamos a usar
      Button button1 = (Button) findViewById(R.id.button1);
      Button button2 = (Button) findViewById(R.id.button2);
 
      // Fijamos un evento onclick para el button1, cada vez que
      // lo pulsemos se llamará a este método (que abrirá una actividad)
      button1.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            Intent intent = new Intent(mainActivity.this, Activity1.class);
            startActivity(intent);
         }
      });
 
      //button2 pasará parámetros a otra actividad, y los devolverá
      button2.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            Intent intent = new Intent(mainActivity.this, ParametrosActivity.class);
 
            // damos valor al parámetro a pasar
            intent.putExtra("param1", "valor del parámetro 1 (viene de mainActivity)");
            /*
             * Inicia una actividad que devolverá un resultado cuando
             * haya terminado. Cuando la actividad termina, se llama al método
             * onActivityResult() con el requestCode dado.
             * El uso de un requestCode negativo es lo mismo que llamar a 
             * startActivity(intent) (la actividad no se iniciará como una
             * sub-actividad).
             */
            startActivityForResult(intent, REQUEST_CODE);
         }
      });
   }
 
   /*
    * Éste método se llama cuando la actividad que iniciamos con un startActivityForResult
    * finaliza, dandi el REQUEST_CODE con el que llamó, el resultCode se devuelve, junto con
    * algunos datos adicionales, el resultCode será RESULT_CANCELED si la actividad devuelve
    * eso explícitamente, si no devuelve ningún resultado o si la operación finalizó de forma inesperada.
    */
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == REQUEST_CODE) {
         // tomamos el valor devuelto por la otra actividad
         String result = data.getStringExtra("result");
         // enseñamos al usuario el resultado
         Toast.makeText(this, "ParametrosActivity devolvió: " + result, Toast.LENGTH_LONG).show();
      }
   }
}
En esta clase vamos a modificar el comportamiento de los botones, añadiendoles listeners para cuando el usuario haga click en ellos.
Por último, vamos a crear otras dos actividades, la primera (./src/activity1.java), no va a hacer nada, solo mostrarse. La segunda (./src/ParametrosActivity.java), va a recibir un parámetro y devolver otro.

./src/activity1.java

 
package com.msalvetti.test.actividades;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class Activity1 extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.segunda_actividad);
 
      // Capturamos los objetos gráficos que vamos a usar
      TextView text = (TextView) findViewById(R.id.textView1);
      Button button = (Button) findViewById(R.id.boton);
 
      // Agregamos al textView un texto
      text.setText(R.string.cadena1);
 
      // Cambiamos el texto al botón
      button.setText(R.string.salir);
 
      // Evento onclick del botón, cuando se pulse, cerramos la actividad
      button.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            finish();
         }
      });
   }
}

./src/ParametrosActivity.java

package com.msalvetti.test.actividades;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class ParametrosActivity extends Activity {
   private static final int OK_RESULT_CODE = 1;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.segunda_actividad);
 
      // Capturamos los objetos gráficos que vamos a usar
      TextView text = (TextView) findViewById(R.id.textView1);
      Button button = (Button) findViewById(R.id.boton);
      TextView params = (TextView) findViewById(R.id.params);
 
      text.setText(R.string.cadena2);
 
      button.setText(R.string.salir);
 
      //Al pulsar el botón cerramos la ventana y volveremos a la anterior
      button.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            //Cierra la actividad y la saca de la pila
            returnParams();
         }
      });
 
      // Mostramos los parámetros recibidos de la actividad mainActivity
      Bundle reicieveParams = getIntent().getExtras();
      params.setText(reicieveParams.getString("param1"));
   }
 
   protected void returnParams() {
      Intent intent = new Intent();
      intent.putExtra("result", "'Valor devuelto por ParametrosActivity'");
      setResult(OK_RESULT_CODE, intent);
      finish();
   }
}
Es un ejemplo simple, pero que sirve a modo de repaso para practicar el manejo de las actividades y el paso de parametros entre ellas.

No hay comentarios:

Publicar un comentario