Как вернуть результат (startActivityForResult) из действия TabHost?
у меня есть 3 класса в моем примере:
Класс а, основной вид деятельности. Класс 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. Как мне вернуть что-то из действия внутри TabHost?
Я понимаю, что проблема в том, что мой класс C фактически работает внутри класса B, А Класс B-это то, что возвращает RESULT_CANCELED назад к классу А. Я просто еще не знаю, как обойти.
5 ответов:
О, боже! Проведя несколько часов и загрузив источники Android, я, наконец, пришел к решению.
если вы посмотрите на занятие, вы увидите, что
finish()метод только отправляет обратно результат, если есть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(); }
намерениях.FLAG_ACTIVITY_FORWARD_RESULT?
Если установлено и это намерение используется для запуска нового действия из существующий, то цель ответа существующей деятельности будет перешли к новой деятельности.
вы можете реализовать onActivityResult в классе B, а также запустить Класс C с помощью startActivityForResult. Как только вы получите результат в классе B, установите результат там (для класса A) на основе результата из класса C. Я не пробовал это, но я думаю, что это должно работать.
еще одна вещь, на которую следует обратить внимание, заключается в том, что Activity A не должна быть однократной активностью. Для startActivityForResult для работы Ваш класс B должен быть подразделом activity на Activity A, а это не так возможно в одном экземпляре действия, новое действие (класс B) запускается в новой задаче.
для запуска действия 2 из действия 1 и получения результата можно использовать startActivityForResult и реализовать 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);
Comments