Siguiendo el tema que abrimos ayer (de hace unos años), 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 😉