我在应用的文件夹选择器部分中有以下活动序列:
活动 A 启动 B 。 B 然后在用户深入文件夹树时启动堆栈本身的实例。每当 B 的实例完成(选择文件夹)时,它和所有前面的 B 应该完成, A 应该再次显示,传播的结果。如果用户回溯,则前面的 B 不应该完成,因为用户应该能够在文件夹子树之间来回切换。
我正在尝试使用startActivityForResult,从 A 到 B ,然后为 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(2)返回时在 B(1)中调用,而不是当我后来从 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();
}
}
提前致谢。
答案 0 :(得分:1)
这是一个可怕的建筑!在遍历树时,您不应创建B
的多个实例。最终你会耗尽内存!您应该使用Activity
的单个实例,当用户在树中向上或向下移动时,您应该只更改Activity
中显示的数据。您应该有一个描述树的内部数据模型,您只需要记住当前显示的树中的哪个节点。如果您还想支持用户返回(通过使用BACK按钮),您可以创建自己的堆栈(不是一堆活动,而只是一堆树节点引用),您可以使用它来确定哪个节点树从当前节点返回。这是一个简单的数据管理问题,您的架构已迫使其成为View
管理问题。