Android – recibir respuesta desde Activity

Siguiendo el tema que abrimos ayer, y trabajando sobre la misma aplicación vamos a abrir una nueva ventana, pasándole unos datos, y que está al cerrarse nos diga si todo ha sido correcto, y nos devuelva otros datos; para ello vamos a ir a nuestra aplicación y allí abriremos ventana2.java en donde para empezar creamos un botón en ventana2.xml, y le asignamos en la función onClick la función enviarConRespuesta que ahora declararemos; fuera del método OnCreate nuestros editText, para tenerlos accesibles desde toda la clase

public class ventana2 extends Activity{
    EditText textNombre;
    EditText textEdad;
    …..

Una vez hagamos esto declararemos la siguiente función

    public void enviarConRespuesta(View view) {
        Intent intent= new Intent(this, abriendoPorCodigo.class);
        intent.putExtra(“nombre”, textNombre.getText().toString());
        intent.putExtra(“edad”, textEdad.getText().toString());
        startActivityForResult(intent, 0000);
    }

La cual lo único que hace es declarar una nueva intención, en la cual abriremos la vista que está vinculada a abriendoPorCodigo.java; la pasamos 2 datos “extra”, los cuales son los textos que tenemos escritos en los EditText, y el secreto viene en la última línea, en la que lanzamos la intención.

Pero en modo espera de resultado, y le damos un código nuestro, para así que cuando cierre sepamos que nosotros le habíamos mandado y esperamos datos, ya que desde Android, cualquier aplicación puede lanzar activity incluso de otras aplicaciones; después sobre escribiremos el método onActivityResult el cual es el encargado de esperar la respuesta de la otra activity

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0000 && resultCode ==RESULT_OK){
            String resultado = data.getExtras().getString(“resultado”);

            Toast toast = Toast.makeText(getApplicationContext(), resultado, Toast.LENGTH_LONG);                    toast.show();
        }
    }

Borramos el código que nos mete por defecto eclipse, que lo único que hace es llamar al super(); y en su lugar escribimos un filtro, para que solo actúe cuando le llegue el código que nosotros hemos definido antes, y que además el resultado sea Ok; en ese caso recogemos el “extra” del resultado, o respuesta que nos da la otra activity, y la mostramos en un mensaje emergente.

Por otro lado, en abriendoPorCodigo.xml, le borramos el texto al textView que teníamos preparado y en abriendoPorCodigo.java escribimos el siguiente código dentro del método OnCreate:

        Bundle extras = getIntent().getExtras();
        String nombre = extras.getString(“nombre”);
        String edad = extras.getString(“edad”);

        TextView label = (TextView) findViewById(R.id.txtVMuestra);
        label.setText(“Nombre: ” + nombre + “, Edad: ” + edad);

        String textResultado =”Recibido: ” + label.getText();

        Intent intent = new Intent();
        intent.putExtra(“resultado”,textResultado);
        setResult(RESULT_OK, intent);
        //finish();

Donde declaramos un Bundle para rescatar los datos enviados por el activity anterior, y le asignamos al textView esos datos, con una pequeña etiqueta descriptiva delante de cada uno; también declaramos una variable a la que le asignamos el texto “recibido” y le añadimos el texto que tenemos en el TextView; para finalizar declaramos una intención simple, en la que añadimos un extra llamado resultado, y le damos el valor declarado en la variable anterior, le asignamos el resultado en Ok, y lo mandamos junto con la intención.
Opcionalmente, podemos añadir la función finish(); que lo que hace es cerrar la activity una vez llega a esa línea, por lo que no llegaríamos a verla, tan solo notaríamos un pequeño parpadeo en pantalla desde que la intentamos abrir desde el activity anterior hasta que vuelve al mismo; prueba hacerlo funcionar con y sin esa línea 😉

Como de costumbre publico el código en GitHub aquí te dejo el enlace: http://adf.ly/LkOgw 😉