Imprimir

Ya hemos podido ver en otros artículos cómo Iniciar otra activity y cómo Pasar datos a otra activity que ha sido iniciada. En este caso veremos que también es posible obtener datos que han sido generados en la activity que ha sido llamada desde otra activity.

Para ello, debemos usar el método startActivityForResult de la clase Activity, en lugar de iniciar la otra activity con startActivity como se ha hecho anteriormente.

public void startActivityForResult (Intent intent, int requestCode)

Como se puede ver en la API, además de indicar por parámetro la referencia al intent que se desea iniciar, hay que indicar un segundo parámetro con un código de tipo entero que va a identificar a la petición que vamos a realizar para iniciar otra activity para obtener resultados de ella. Dicho código puede ser cualquier número. Tan sólo debe ser diferente de otros código que utilicemos si vamos a iniciar varias activities. Por tanto, una buena manera de usar ese código es declarando una constante para cada activity que se quiera iniciar para obtener resultados, para evitar confusiones. Por ejemplo, si disponemos de un botón que va a realizar la llamada a una segunda activity cuyo código se encuentra en la clase SegundaActivity:

{code}private final int PETICION_ACTIVITY_SEGUNDA = 1;

public void onClickBoton(View v) {
    Intent intent = new Intent(this, SegundaActivity.class);
    startActivityForResult(intent, PETICION_ACTIVITY_SEGUNDA);
}{/code}

Para poder manipular los datos que obtengamos a la vuelta de la activity que ha sido iniciada, debemos sobreescribir el método onActivityResult, que es llamado automáticamente en ese momento. La cabecera del método debe ser la siguiente:

protected void onActivityResult(int requestCode, int resultCode, Intent data)

Donde los parámetros permiten obtener la siguiente información:

Una estructura básica para el ejemplo que se está construyendo podría ser similar al siguiente:

{code}protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //Comprobar de qué petición se está obteniendo el resultado (requestCode)
    if(requestCode==PETICION_ACTIVITY_SEGUNDA) {
        //Comprobar el tipo de resultado (resultCode)
        if(resultCode==Activity.RESULT_OK) {
            //Operaciones a realizar si se ha pulsado un botón "Aceptar"
        } else {
            //Operaciones a realizar si se ha pulsado un botón "Cancelar" o "Retroceder"
        }
    }
}{/code}

Para ver un ejemplo completo de una primera activity que quiere recoger un String que ha introducido el usuario en una segunda activity, se podría escribir el código siguiente:

{code}public class MainActivity extends Activity {
    private final int PETICION_ACTIVITY_SEGUNDA = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void onClickBoton(View v) {
        Intent intent = new Intent(this, SegundaActivity.class);
        startActivityForResult(intent, PETICION_ACTIVITY_SEGUNDA);
    }
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==PETICION_ACTIVITY_SEGUNDA) {
            if(resultCode==Activity.RESULT_OK) {
                String textoCapturado = data.getStringExtra(SegundaActivity.TEXTO_CAPTURADO);
            }
        }
    }
}{/code}

La segunda activity debe pasar los datos a la primera activity usando el método putExtra de la clase Intent, de la misma manera que se ha utilizado para el método startActivity sin obtención de resultados. El método setResult permite indicar un código de resultado que será recogido por la activity que ha realizado la llamada:

public final void setResult (int resultCode, Intent data)

En los parámetros se debe especificar lo siguiente:

El método finish de la clase Activity permite finalizar la activity en la que se encuentre.

public void finish ()

Continuando con el ejemplo anterior, podemos tener una segunda activity con un campo de texto (EditText) en el que el usuario pueda escribir un texto que se enviará a la activity que ha realizado la llamada. Se dispone de un botón Aceptar para enviar el texto y otro Cancelar para volver sin enviarlo.

{code}public class SegundaActivity extends Activity {

    public final static String TEXTO_CAPTURADO = "com.example.pruebaactivityforresult.TEXTO_CAPTURADO";
    EditText editText1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_segunda);
        
        editText1 = (EditText)findViewById(R.id.editText1);
    }

    public void onClickButtonAceptar(View v) {
        Intent intentRetornoDatos = new Intent();
        intentRetornoDatos.putExtra(TEXTO_CAPTURADO, editText1.getText().toString());
        setResult(Activity.RESULT_OK, intentRetornoDatos);
        finish();
    }    
    
    public void onClickButtonCancelar(View v) {
        Intent intentRetornoDatos = new Intent();
        setResult(Activity.RESULT_CANCELED, intentRetornoDatos);
        finish();
    }
}
{/code}