2 baifaxiaoyao baifaxiaoyao 于 2012.10.23 14:26 提问

如何从一个TabHost Activity中返回一个结果(startActivityForResult)

在我的示例中有三个类:Class A,主类。Class A调用一个startActivityForResult

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

Class B, 这个类是一个TabActivity:

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

Class C, 这个类是一个正式的Activity:

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

onActivityResult在 Class A中被调用, 但是resultCode是RESULT_CANCELED而不是RESULT_OK 而且返回的intent是null。我怎么能从Activity返回,而不是从TabHost?
我知道这个问题是我的Class C实际上是代替了Class B运行的,而且Class B是返回RESULT_CANCELED到Class A。我只是不知道有一个还起作用。

1个回答

niangzhi
niangzhi   2012.10.23 17:06
已采纳

哎,在弄了几个小时和下载了android资源后,我终于找到答案了。
如果你仔细检查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);
    }
}

所以我的解决方案就是如果存在的话,就将结果发到父activity中,就像这样

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

如果有人同样碰到了这个问题,我希望我的方法能够帮助你。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!