【问题标题】:onActivityResult only called onceonActivityResult 只调用一次
【发布时间】:2016-09-08 22:35:00
【问题描述】:

我在应用的文件夹选择器部分有以下活动序列:

活动 A 启动 BB 然后启动自身的实例,随着用户深入文件夹树而堆叠。每当 B 的实例完成(选择文件夹)时,它和所有前面的 B 都应该完成,并且应该再次显示 A,并传播的结果。如果用户回溯,前面的B应该不会结束,因为用户应该能够在文件夹子树之间来回切换。

我正在尝试通过使用 startActivityForResult 来完成此操作,从 AB,然后对于 B 的每个新实例。当用户完成一个实例 B 时,我使用 setResult 并希望在每个前面的实例的 onActivityResult 方法中检查它。如果是 RESULT_OK,我再次设置结果并完成该实例,直到所有这些都以级联序列完成并且 A 再次显示结果。

只要我去 A => B(1) => B(2) => B(3) 并完成,在 B 部分没有回溯。

但是,如果我去 A => B(1) => B(2) => 回到 B (1) => B(3) 并完成,onActivityResult 仅在 B(1)B(2) 返回时调用 第一次,而不是我后来从 B(3) 完成时回到它。 B(1) 在此序列中从 B(3) 返回时只是简单地恢复。这会破坏级联完成顺序。

为什么 onActivityResult 对于实例 B(1) 只调用一次?每次子活动设置结果并完成时不应该调用它吗?

这里有一些代码:

=== 活动 A

启动第一个 B 实例:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivityForResult(intent, RequestCodes.ActivityB);

收到最终的B结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode == RESULT_OK){
    ...
  }
}

=== 活动 B

从自己开始新的孩子B

Intent intent = new Intent(ActivityB.this, ActivityB.class);
startActivityForResult(intent, RequestCodes.ActivityB);

选择文件夹时设置结果:

Intent result = new Intent();
result.putExtra(...);
setResult(Activity.RESULT_OK, result);
finish();

接收子 B 导致每个父 B 实例(由于某种原因仅在 B(1) 中第一次调用):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode == RESULT_OK){
    setResult(Activity.RESULT_OK, data);
    finish();
  }
}

提前致谢。

【问题讨论】:

  • 在最后一种方法中你应该改为setResult(..., data) 这是一个错字还是一个错误?
  • 这是一个错字,是的,它是代码中的数据。谢谢。

标签: android android-activity android-navigation


【解决方案1】:

这是一个可怕的架构!遍历树时不应创建多个 B 实例。最终你会耗尽内存!您应该使用Activity 的单个实例,并且当用户在树中向上或向下移动时,您应该只更改您在Activity 中显示的数据。您应该有一个描述树的内部数据模型,并且您只需要记住当前显示的树中的哪个节点。如果您还想支持用户返回(通过使用 BACK 按钮),您可以创建自己的堆栈(不是一个活动堆栈,而只是一个树节点引用堆栈),您可以使用它来确定哪个节点从当前节点返回的树。这是一个简单的数据管理问题,而您的架构迫使这变成了View 管理问题。

【讨论】:

  • 感谢您的回答,您说的完全正确。我将在最终的应用程序中选择另一种架构。虽然我仍然很想知道为什么 onActivityResult 在序列中只被调用一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2016-08-18
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多