Как вернуть результат (startActivityForResult) из TabHost Activity?

У меня есть 3 класса в моем примере: класс A, основной вид деятельности. Класс A вызывает startActivityForResult:

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

Класс B, этот класс является TabActivity:

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

Класс C, этот класс является регулярным. Активность:

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

OnActivityResult вызывается в классе A, но resultCode – RESULT_CANCELED вместо RESULT_OK а возвращаемое намерение – null. Как мне вернуть что-то из Activity внутри TabHost?

Я понимаю, что проблема в том, что мой класс C фактически запущен внутри класса B, а класс B – это то, что возвращает RESULT_CANCELED обратно в класс A. Я пока еще не знаю, как работать.

Solutions Collecting From Web of "Как вернуть результат (startActivityForResult) из TabHost Activity?"

О Боже! Проведя несколько часов и загрузив исходные файлы Android, я наконец пришел к решению.

Если вы посмотрите на класс Activity, вы увидите, что метод finish() возвращает результат только в том случае, если свойство mParent установлено mParent null . В противном случае результат будет потерян.

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

Поэтому мое решение заключается в том, чтобы установить результат в родительскую активность, если таковой имеется:

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

Я надеюсь, что это будет полезно, если кто-то снова найдет эту проблему.

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

С небольшой модификацией для параметра «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?

Если установлено, и это намерение используется для запуска нового действия из существующего, тогда цель ответа существующего действия будет перенесена в новое действие.

Вы также можете реализовать onActivityResult в классе B и запустить класс C, используя startActivityForResult. Как только вы получите результат в классе B, установите результат там (для класса A) на основе результата класса C. Я не пробовал это, но я думаю, что это должно сработать.

Еще одна вещь, которую нужно обратить внимание, заключается в том, что Activity A не должен быть singleInstance. Для работы startActivityForResult ваш класс B должен быть суб-активностью для Activity A, и это невозможно в активности одного экземпляра, новый Activity (класс B) запускается в новой задаче.

Для запуска Activit 2 из Activity 1 и получения результата, вы colud используете startActivityForResul и реализуете onActivityResult в действии 1 и используете setResult в Activity2.

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