¿Cómo devolver un resultado (startActivityForResult) de una actividad TabHost?

Tengo 3 clases en mi ejemplo: Clase A, la actividad principal. La clase A llama a startActivityForResult:

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

Clase B, esta clase es una TabActivity:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

Clase C, esta clase es una actividad regular:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult se llama en la Clase A, pero el resultCode es RESULT_CANCELED en lugar de RESULT_OK y la intención devuelta es nula. ¿Cómo devuelvo algo de la actividad dentro de un TabHost?

Me doy cuenta de que el problema es que mi Clase C en realidad se está ejecutando dentro de la Clase B, y la Clase B es lo que está devolviendo el RESULT_CANCELED de regreso a la Clase A. Simplemente no conozco una solución alternativa todavía.

preguntado el 22 de marzo de 10 a las 23:03

5 Respuestas

¡Oh Dios! Después de pasar varias horas y descargar las fuentes de Android, finalmente he llegado a una solución.

Si miras la clase Actividad, verás que finish() El método solo devuelve el resultado si hay un mParent propiedad establecida en null. De lo contrario, se pierde el resultado.

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

Entonces, mi solución es establecer el resultado en la actividad principal si está presente, así:

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

Espero que sea útil si alguien busca de nuevo este problema.

Respondido 08 ago 11, 23:08

Publiqué una solución pirata aquí, es simple e implica una actividad transparente sin contenido: obtiene las funciones normales del ciclo de vida y hace que todo sea más fácil. stackoverflow.com/questions/7812120/… - CQM

¡Eso es genial! ¡Gracias, gracias, gracias! Funciona perfectamente y con muy poco alboroto. He anulado los métodos regulares setResult () para todas mis actividades con esta pequeña joya. ¡Gracias! - SM Bigggs

Usé su solución, pero mi código aún no detecta el método onactivityresult cuando regresa. por favor ayúdame .. ¿necesito usar algo más? - skygeek

Por qué se devuelve un resultado en una actividad que no se documenta en ninguna parte de las guías de la API, me pareció extraño. - alex.p

¡Maldita sea! ¡Buen trabajo, Illya! Gracias - Sirelón

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

Con una ligera modificación de "param_result"

/* Start Activity */
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
    startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case 90:
        if (resultCode == RESULT_OK) {
            Bundle res = data.getExtras();
            String result = res.getString("param_result");
            Log.d("FIRST", "result:"+result);
        }
        break;
    }
}

private void finishWithResult()
{
    Bundle conData = new Bundle();
    conData.putString("param_result", "Thanks Thanks");
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(RESULT_OK, intent);
    finish();
}

Respondido 14 ago 13, 15:08

Sencillo, setResult fue lo principal. Póngalo en algo, o un valor, por ejemplo RESULT_OK y estás listo para irte; setResult(RESULT_OK);. Me ayudó, +1 - Afzaal Ahmad Zeeshan

Intención.FLAG_ACTIVITY_FORWARD_RESULT?

Si se establece y esta intención se utiliza para lanzar una nueva actividad a partir de una existente, el objetivo de respuesta de la actividad existente se transferirá a la nueva actividad.

Respondido 13 Jul 11, 01:07

También puede implementar un onActivityResult en la Clase B y lanzar la Clase C usando startActivityForResult. Una vez que obtenga el resultado en la Clase B, establezca el resultado allí (para la Clase A) según el resultado de la Clase C. No lo he probado, pero creo que debería funcionar.

Otra cosa a tener en cuenta es que la actividad A no debe ser una actividad de una sola instancia. Para que startActivityForResult funcione, su Clase B debe ser una subactividad de la Actividad A y eso no es posible en una actividad de instancia única, la nueva Actividad (Clase B) comienza en una nueva tarea.

respondido 23 mar '10, 06:03

Dado que la Clase B es una TabActivity y la Clase C es una Tab en esa actividad, no puede hacer un startActivityForResult en la Clase B. Ninguna de mis actividades son Actividades de instancia única. - cameron mcbride

Para iniciar la Actividad 2 desde la Actividad 1 y obtener el resultado, puede usar startActivityForResult e implementar onActivityResult en la Actividad 1 y usar setResult en la Actividad2.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);

respondido 06 nov., 17:17

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.