如何从TabHost活动返回结果(startActivityForResult)?
我的例子中有三个类: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();
在类A中调用onActivityResult,但是resultCode是RESULT_CANCELED
而不是RESULT_OK
,返回的intent是null。 如何从TabHost中的活动返回某些内容?
我意识到问题是我的C类实际上是在类B中运行的,而类B是什么将RESULT_CANCELED
返回到类A.我只是不知道一个工作。
天啊! 花了几个小时,然后下载Android资源,我终于find了一个解决scheme。
如果您查看Activity类,您将看到,如果mParent
属性设置为null
, finish()
方法仅返回结果。 否则结果会丢失。
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); } }
所以我的解决scheme是将结果设置为父活动(如果存在),如下所示:
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?
如果已设置,并且正在使用此意图从现有活动启动新活动,则将现有活动的回复目标转移到新活动。
您也可以在类B中实现onActivityResult,并使用startActivityForResult启动类C. 一旦你在类B中得到结果,然后根据类C的结果在那里设置结果(对于类A)。我还没有尝试过,但我认为这应该工作。
另外要注意的是,活动A不应该是一个singleInstance活动。 要使startActivityForResult正常工作,您的类B需要成为活动A的子活动,并且在单个实例活动中不可能,新的活动(类B)将从新的任务开始。
为了从Activity 1开始Activity 2并获得结果,可以使用startActivityForResult并在Activity 1中实现onActivityResult并在Activity2中使用setResult。
Intent intent = new Intent(this, Activity2.class); intent.putExtra(NUMERO1, numero1); intent.putExtra(NUMERO2, numero2); //startActivity(intent); startActivityForResult(intent, MI_REQUEST_CODE);