我遇到了以下问题: 有活动A,B,C和D. B,C和D的每个活动都包含一个项目列表。
现在让我们从A开始: 从A我想去活动D选择一个项目并把它放在A的某个地方。 但要从A到D,我必须通过B和C. 这是因为B,C和D代表了一个对象树。
所以我按以下方式开始活动: A => B => C => d 最后我想将项目从D传递给A.
直到我的代码工作正常!
但: 想象一下,用户在活动C中选择了错误的项目。因此,他将在活动D中获得错误列表。 用户会做什么?用户将返回C,选择正确的项目,因此将显示D中的正确列表。 然后,用户将在D中选择想要的项目,该项目将被传递回活动A.
这不起作用。 因此,每当用户使用后退按钮在树中返回一个级别时,代码就不再起作用了。
具体来说它不起作用,因为如果我从D回到C,则活动C不再有调用Activity(actvityC.getCallingActivity()为null)。
从A到B我使用startActivityForResult()。 要从B到C,从C到D,我使用startActivity()和Intent.FLAG_ACTIVITY_FORWARD_RESULT。
我希望你能理解我的问题,并能帮助我。
问候
编辑:删除拼写错误
答案 0 :(得分:0)
一个有趣的问题!
要解决此问题,您需要覆盖onBackPressed()
中的ActivityD
,如下所示:
@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);
}
您可能还需要覆盖onBackPressed()
中的ActivityC
,这样就可以回到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,并在onNewIntent()
的现有实例上调用ActivityA
。
如果您需要将附加内容从A传递到B到C到D,您只需将它们添加到用于分别启动B,C和D的Intent
。
在ActivityA
中,您需要覆盖onNewIntent()
,以便抓取Intent
发回的ActivityD
。