android - 如何从 TabHost Activity 返回结果(startActivityForResult)?

标签 android android-activity android-tabhost

在我的示例中有 3 个类: A类,主要 Activity 。 A 类调用一个 startActivityForResult:

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

B类,这个类是一个TabActivity:

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

C类,这个类是一个普通的Activity:

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

onActivityResult 在 A 类中被调用,但是 resultCode 是 RESULT_CANCELED 而不是 RESULT_OK 并且返回的 Intent 为 null。如何从 TabHost 内的 Activity 返回内容?

我意识到问题在于我的 C 类实际上是在 B 类内部运行的,而 B 类是将 RESULT_CANCELED 返回到 A 类的原因。我只是不知道工作还来得及。

最佳答案

哦,天哪!花了几个小时下载了安卓源码,终于找到了解决办法。

如果你查看 Activity 类,你会看到,finish() 方法只有在 mParent 属性设置为 时才会返回结果空。否则结果丢失。

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

如果有人再次寻找此问题的解决方法,我希望这会有所帮助。

关于android - 如何从 TabHost Activity 返回结果(startActivityForResult)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497205/

相关文章:

android - 在android中的布局之间切换

iphone - quartz 2D 或 OpenGL ES?长期利弊,迁移到其他平台的可能性

android - 如何在我正在 Robotium 中测试的类中调用方法

Android StartActivity 选项菜单

java - 清理我的项目后,R.java 文件消失了

android - Fragment 的 oncreateView() 中的 NullPointerException

android - 非法状态异常 : No Activity

Android Connectivity BroadcastReceiver 的触发速度不够快

android - 使用 ListView 时如何修复底部标签栏

Android tabcontent 包含将内容隐藏在选项卡后面的 ScrollView