Comment retourner un résultat (startActivityForResult) à partir d’une activité TabHost?

J’ai 3 classes dans mon exemple: la classe A, l’activité principale. La classe A appelle un startActivityForResult:

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

Classe B, cette classe est un TabActivity:

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

Classe C, cette classe est une activité régulière:

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

onActivityResult est appelée dans la classe A, mais resultCode est RESULT_CANCELED au lieu de RESULT_OK et l’intention renvoyée est null. Comment est-ce que je retourne quelque chose de l’activité dans un TabHost?

Je me rends compte que le problème est que ma classe C est en cours d’exécution à l’intérieur de la classe B, et la classe B est ce qui retourne le RESULT_CANCELED à la classe A. Je ne connais pas encore un travail autour.

Oh mon Dieu! Après avoir passé plusieurs heures à télécharger les sources Android, je suis enfin parvenu à une solution.

Si vous examinez la classe Activity, vous verrez que cette méthode finish() ne renvoie le résultat que si la propriété mParent définie sur null . Sinon, le résultat est perdu.

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

Donc, ma solution consiste à définir le résultat sur l’activité parente si elle est présente, comme ceci:

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

J’espère que cela sera utile si quelqu’un cherche encore une solution à ce problème.

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

Avec une légère modification pour “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(); Ssortingng result = res.getSsortingng("param_result"); Log.d("FIRST", "result:"+result); } break; } } private void finishWithResult() { Bundle conData = new Bundle(); conData.putSsortingng("param_result", "Thanks Thanks"); Intent intent = new Intent(); intent.putExtras(conData); setResult(RESULT_OK, intent); finish(); } 

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

Si cette option est utilisée et que cette intention est utilisée pour lancer une nouvelle activité à partir d’une activité existante, la cible de réponse de l’activité existante sera transférée à la nouvelle activité.

Vous pouvez également implémenter un onActivityResult dans la classe B et lancer la classe C à l’aide de startActivityForResult. Une fois que vous obtenez le résultat dans la classe B, définissez le résultat (pour la classe A) en fonction du résultat de la classe C. Je ne l’ai pas essayé mais je pense que cela devrait fonctionner.

Une autre chose à surveiller est que l’activité A ne doit pas être une activité unique. Pour que startActivityForResult fonctionne, votre classe B doit être une sous-activité de l’activité A, ce qui n’est pas possible dans une seule activité d’instance. La nouvelle activité (classe B) démarre dans une nouvelle tâche.

Pour le démarrage de l’activité 2 de l’activité 1 et l’obtention du résultat, vous pouvez utiliser startActivityForResult et implémenter onActivityResult dans l’activité 1 et utiliser setResult dans Activity2.

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