studio start intent for example activity android android-activity android-tabhost

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



startactivityforresult activity android (5)

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

Si observa la clase de actividad, verá que el método finish() solo devuelve el resultado si hay una propiedad mParent 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); } }

Así que 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 de ayuda si alguien busca este problema nuevamente.

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 código de resultado es RESULT_CANCELED lugar de RESULT_OK y el intento 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 realmente dentro de la Clase B, y la Clase B es lo que está devolviendo el RESULT_CANCELED a la Clase A. Todavía no conozco una RESULT_CANCELED .


Intención.FLAG_ACTIVITY_FORWARD_RESULT?

Si se establece y esta intención se está utilizando para iniciar una nueva actividad desde una existente, el objetivo de respuesta de la actividad existente se transferirá a la nueva actividad.


Para iniciar la Actividad 2 de 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);


También puede implementar un onActivityResult en la clase B y lanzar la clase C utilizando startActivityForResult. Una vez que obtenga el resultado en la Clase B, establezca el resultado allí (para la Clase A) basándose en el resultado de la Clase C. No lo he intentado 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 sola actividad de instancia, la nueva Actividad (Clase B) comienza en una nueva tarea.


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(); }