【问题标题】:Can't get activity-result via hierarchical structured activities when going up and down the tree上下树时无法通过分层结构化活动获得活动结果
【发布时间】:2015-05-12 13:01:51
【问题描述】:

我遇到了以下问题: 有活动 A、B、C 和 D。 B、C 和 D 的每个 Activity 都包含一个项目列表。

现在让我们从 A 开始: 从 A 我想去活动 D 选择一个项目并将其放在 A 的某个地方。 但要从 A 到 D,我必须经过 B 和 C。 那是因为 B、C 和 D 代表一棵对象树。

所以我通过以下方式开始活动: A => B => C => D 最后我想将项目从 D 传递给 A。

到目前为止,我的代码工作正常!

但是: 假设用户在活动 C 中选择了错误的项目。因此他将在活动 D 中得到错误列表。 用户会怎么做?用户将返回 C,选择正确的项目,因此将显示 D 中的正确列表。 然后用户将在 D 中选择想要的项目,并将其传递回 Activity A。

这行不通。 因此,每当用户使用后退按钮返回树中的一级时,代码就不再起作用了。

特别是它不起作用,因为如果我从 D 回到 C Activity C 不再有调用 Activity(actvityC.getCallingActivity() 为空)。

要从 A 转到 B,我使用 startActivityForResult()。 要从 B 到 C,从 C 到 D,我使用 startActivity() 和 Intent.FLAG_ACTIVITY_FORWARD_RESULT。

希望你能理解我的问题并能帮助我。

问候

已编辑:错字已删除

【问题讨论】:

    标签: android android-intent android-activity start-activity


    【解决方案1】:

    一个有趣的问题!

    要解决这个问题,您需要像这样覆盖ActivityD 中的onBackPressed()

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(this, ActivityC.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        // add any necessary extras here
        startActivity(intent);
    }
    

    并且您可能还需要在 ActivityC 中覆盖 onBackPressed(),所以返回到 ActivityB 也是如此。


    但是...另一种可能更容易实现的替代方法是根本不使用startActivityForResult()。 A 可以直接启动 B。B 可以启动 C,C 可以启动 D,当用户在 D 中实际选择了某些内容时,D 可以直接将结果返回给 A,如下所示:

    Intent intent = new Intent(this, ActivityA.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    // add whatever extras you want to send back to A
    startActivity(intent);
    

    这将从堆栈中删除活动 D、C 和 B,并在 ActivityA 的现有实例上调用 onNewIntent()

    如果您需要将 extra 从 A 传递到 B 到 C 到 D,您可以将它们添加到用于分别启动 B、C 和 D 的 Intent

    ActivityA 中,您需要覆盖onNewIntent(),您可以在其中捕获ActivityD 发回的Intent

    【讨论】:

    • 首先,谢谢! I solved it by using startActivityForResult() in each Activity of A, B and C. When an item in D is selected, then I give it back by setting the result and firing finish() in D, C and B (in this order )。我认为这个解决方案有点笨拙,因为我恢复 C 和 B 并在之后直接关闭它们。因此,我将在几天内实施您的解决方案之一(现在没有时间)。如果它有效,我当然会支持你的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多