Android: ¿cómo hacer que una actividad devuelva resultados a la actividad que la llama?

128

Tengo una Locationactividad que se puede llamar desde muchas actividades, como Sign upy Order. En la Locationactividad, el usuario ingresa su ubicación, por lo que la actividad Locationdevolverá esta nueva ubicación a la actividad que la llamó.

Entonces, cuando la Sign upactividad llama a la Locationactividad, tiene que devolver los datos a la Sign upactividad. En otra ocasión la Orderactividad hará lo mismo.

Nota

Sé que me dirás que debo publicar el código, pero no te pido que me des el código; Solo quiero algunos consejos, enlaces o buenos hilos.

usuario usuario
fuente
puede usar la llamada de acabado () para volver ..
Harshid
1
¿Comprobó StartActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar
@ Harshid, ¿podría darme más detalles, por favor, o si tiene enlaces que agradecería
Usuario usuario

Respuestas:

253

Para comenzar una actividad que debería devolver el resultado a la actividad de llamada, debe hacer algo como a continuación. Debe pasar el código de solicitud como se muestra a continuación para identificar que obtuvo el resultado de la actividad que inició.

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

En la actividad puede utilizar setData()para devolver el resultado.

Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

Entonces, de nuevo en la primera actividad, escriba el código a continuación en onActivityResult ()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

EDITE en función de su comentario: si desea devolver tres cadenas, siga esto haciendo uso de pares clave / valor con intención en lugar de usar Uri.

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

Obtenga en OnActivityResult como a continuación:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}
Kanth
fuente
que dices no entiendo tu último comentario, lo siento, no soy un buen inglés, estoy probando tu código ahora, ¿qué requestcodepuedo ponerle un número entero?
usuario usuario
1
Le dije que no había problemas (NP) y, como usted dijo que podría retrasarse en la implementación de esto, le respondí que se tomara su tiempo y luego lo comentara para que me notifiquen. Al llegar a requestcode, sí, puede dar un valor entero como int requestCode = 1;
Kanth
sí, funciona bien, acepto su respuesta, muchas gracias, quiero preguntarle si hay alguna manera, así que no solo envíe cadenas, quiero enviar 3 cadenas, como "ciudad", "calle", " hogar ", hay una manera de etiquetar las cuerdas?
usuario usuario
su respuesta es excelente, si lo desea, edite el título para que muchos usuarios puedan buscarlo
usuario usuario
Estaba buscando cómo crear la intención : new Intent(this, OtherActivity.class);puedo usar este código en una Actividad.
Usuario
3

Si desea finalizar y simplemente agregar un resultCode(sin datos), puede llamar setResult(int resultCode)antes finish().

Por ejemplo:

...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...

Luego, en su actividad de llamadas, verifique resultCode, para ver si estamos bien.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someCustomRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            // OK!
        }
        else if (resultCode = Activity.RESULT_CANCELED) {
            // something went wrong :-(
        }
    }
}

No olvides llamar a la actividad con startActivityForResult(intent, someCustomRequestCode).

lenooh
fuente
44
el valor de Activity.RESULT_OKes en realidad -1, en caso de que confunda a alguien. Me acaba de sugerir el uso de las Activityconstantes
jacoballenwood