¿Cómo se devuelve un resultado (startActivityForResult) de una actividad de 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 Clase A, pero el resultCode está RESULT_CANCELED lugar de RESULT_OK y el bash devuelto es nulo. ¿Cómo devuelvo algo de la Actividad dentro de un TabHost?

Me doy cuenta de que el problema es que mi Clase C se está ejecutando dentro de la Clase B, y la Clase B es lo que devuelve el RESULT_CANCELED a la Clase A. Simplemente, todavía no sé qué es lo que está RESULT_CANCELED .

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

Si observa la clase Activity, verá que el método finish() solo devuelve el resultado si hay una propiedad mParent establecida en null . De lo contrario, el resultado se pierde.

 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 para 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 vuelve a buscar este problema.

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

Con una ligera modificación para “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(); } 

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

Si se establece y se usa esta intención para iniciar una actividad nueva a partir de una existente, el objective de respuesta de la actividad existente se transferirá a la nueva actividad.

También podría implementar un onActivityResult en la Clase B e iniciar la Clase C usando startActivityForResult. Una vez que obtenga el resultado en la clase B, establezca el resultado allí (para la clase A) en función del 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 sola actividad de instancia. Para que startActivityForResult funcione su clase B debe ser una actividad secundaria para la actividad A y eso no es posible en una sola actividad de instancia, la nueva actividad (clase B) comienza en una nueva tarea.

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

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