Titulo: Retornar datos de una actividad secundaria
Buenas tardes, en este tutorial vamos a aprender a retornar un valor desde una actividad secundaria a una actividad primaria.
Algunas veces se nos puede presentar el problema de que estamos en una actividad en la que necesitamos datos que obtenemos de otra Activity. Es entonces cuando en la Activity en la que nos encontramos, llamamos a otra Activity, elegimos el dato y volvemos a la anterior con ese dato.
-
Creación del Proyecto
Para crear nuestro proyecto nos vamos a dirigir a File -> New -> Android Application Project. En el caso de que no lo tengamos en la lista, nos dirigimos a Other y lo filtramos.
El nombre del proyecto, en mi caso lo he llamado EjemploUsoIntents, pero podeis poner el nombre que querais. El resto de datos lo he dejado igual.
Cuando nos aparezca la ventana para configurar nuestra primera Activity, yo la he llamado FirstActivity, y su archivo xml con la UI se llama activity_first.xml.
-
FirstActivity.java
En esta actividad vamos a disponer de una interfaz gráfica muy simple, la cual veremos a continuación:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FirstActivity" > <TextView android:id="@+id/tvTexto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Texto de la segunda Actividad" android:textSize="20sp"/> <Button android:id="@+id/btn_NextActivity" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Mostrar segunda Actividad" android:onClick="onClick" android:layout_below="@id/tvTexto"/> </RelativeLayout>
Con este código tendremos algo parecido a lo siguiente:
Una vez tenemos esta GUI, vamos a adentrarnos en el código de nuestra Activity, el cual se encuentra en la dirección src/nombre-del-paquete/FirstActivity.java. Su código es el siguiente:
public class FirstActivity extends Activity { int request_code = 1; private TextView tvTexto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); tvTexto = (TextView)findViewById(R.id.tvTexto); } public void onClick(View v){ Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, request_code); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if ((requestCode == request_code) && (resultCode == RESULT_OK)){ tvTexto.setText(data.getDataString()); } } }
Como podemos ver, tenemos una variable de instancia de tipo int llamada request_code, la cual será usada mas tarde en el método onActivityResult para comprobar lo que ha llegado.
El TextView será el encargado de mostrar el texto que seleccionaremos en la segunda Actividad.
En el método onClick, el cual se ejecuta al pulsar en el Button, vemos que no usamos la llamada mediante el método startActivity, sino que usamos el método startActivityForResult(). Este método inicia una actividad de la cual queremos retornar un valor a la actividad que la ha llamado.
-
SecondActivity.java
En este actividad vamos a hacer algo simple. Será la encargada de cargar un ListView con cadenas de texto, y cuando pulsemos sobre un elemento, se cerrará la Actividad y se nos volverá a mostrar la FirstActivity, con el TextView actualizado.
Su GUI es fácil y no requiere mucho trabajo, su código es el siguiente:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SecondActivity" > <ListView android:id="@+id/lv_Strings" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
Nos debería quedar algo así:
Una vez tenemos su UI, vamos a ver el código de la Actividad, que se encuentra en el mismo lugar que nuestra otra actividad, en la carpeta src/nombre-del-paquete/SecondActivity.java.
public class SecondActivity extends Activity { private ListView lvString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); lvString = (ListView)findViewById(R.id.lv_Strings); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, cargarListView()); lvString.setAdapter(adapter); lvString.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub String cad = (String)lvString.getAdapter().getItem(arg2); Intent data = new Intent(); data.setData(Uri.parse(cad)); setResult(RESULT_OK, data); finish(); } }); } private List<String> cargarListView(){ List<String> listaStrings = new ArrayList<String>(); for (int i = 0 ; i < 10; i++){ String cad = "String " + i + " de la Segunda Actividad"; listaStrings.add(cad); } return listaStrings; } }
Lo importante en esta actividad es el código que está dentro del onCLickListener del ListView. Cuando pulsemos sobre un elemento, se va a crear un Intent, el cual tendrá el String que hemos seleccionado. Una vez esté cargado, vamos a llamar al método setResult(), el cual tiene la constante RESULT_OK, es decir, que el resultado que enviamos es correcto. Si por el contrario quisieramos retroceder a la actividad anterior sin enviar nada, podríamos establecer RESULT_CANCELLED. Como segundo argumento, recibe el Intent con los datos que hemos cargado en el. Una vez hecho esto, llamamos al método finish(), el cual finalizará la actividad y volverá a la primera actividad.
-
onActivityResult()
Este método el cual se encuentra en la primera actividad, es el encargado de gestionar el Intent que hemos recibido de la segunda actividad.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if ((requestCode == request_code) && (resultCode == RESULT_OK)){ tvTexto.setText(data.getDataString()); } }
Este método trae consigo los parámetros requestCode, resultCode y data. Los 2 primeros parámetros los usaremos para comprobar, es decir, si el requestCode es igual que el que definimos en la clase de la actividad, y si el resultCode tiene el mismo valor que la constante RESULT_OK, entonces extraemos los datos que trae consigo el Intent.
Como lo que guardamos en nuestro Intent era un objeto de la clase String, usamos el método getDataString() para extraerlo y asignarlo al TextView.
Ahora podemos ejecutar nuestra aplicación y ver como queda tras haber hecho todo lo anterior:
En el siguiente video podemos ver como queda todo ya siendo ejecutado en nuestro emulador, y viendo como efectivamente, el texto que seleccionamos en la segunda actividad, vuelve a la primera y se establece en el TextView.
Sin más, ahora podemos solucionar todos aquellos casos en los que necesitemos usar este método de traspaso de valores entre actividades, solo que de manera inversa a la que normalmente lo hacíamos. Por último el código lo podeis descargar de aquí
Saludos!!!