我知道这个问题看起来很模糊,所以请耐心等待。
我正在使用v4支持库处理嵌套片段,并遇到here描述的错误,其中startActivityForResult()
的结果未被路由到正确的子片段。在该线程中,用户提出了几种解决方法,其中两个(回复#8和#12)描述了基于将请求代码与嵌套片段的路径相关联的解决方案,该片段构成了{{1调用,然后在调用startActivityForResult()
时,通过请求代码查找路径并将结果路由到正确的活动。
如果有几个子片段使用相同的请求代码进行调用,这种方法似乎会遇到问题,因为使用该代码将结果路由到哪个子节点是不明确的。但是,如果我们确切地知道每当我们调用onActivityResult()
时,startActivityForResult()
将始终在片段有机会再次调用onActivityResult()
之前调用{<1}},这就不会成为问题。
所以我的问题是,这是一个合理的假设吗?我startActivityForResult()
的心理模型是我们暂停当前活动,做其他事情,然后在恢复后立即获得活动结果。这是正确的,还是在某种情况下,startActivityForResult()
在恢复后的一段时间后才会被调用?是否有现实情况我会从片段中调用onActivityResult()
,然后在从第一个活动得到结果之前从同一片段再次调用它?
答案 0 :(得分:0)
我相信从您显示的片段中获取结果的最佳方法是在新片段上调用setTargetFragment()
,然后,当您打算在新片段中完成结果时,您调用{{3要检查它是否为null,然后调用getTargetFragment()
来查找请求代码是什么。然后,您可以直接在目标上调用onActivityResult()
,而不是使用通常的方法来设置活动的结果。
所以代码就是这样:
public void showNewFragment() {
FragmentB newFragment = new FragmentB();
newFragment.setTargetFragment(this, REQUEST_CODE);
getChildFragmentManager.beginTransaction()
.add(R.id.frame, newFragment)
.commit;
}
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
// Handle response as normal
}
private void finishWithResult(Bundle resultData) {
if (getTargetFragment() != null) {
// Pass the result back to the parent Fragment
Intent intent = new Intent();
intent.setData(resultData);
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
} else {
// Finish as normal
setResult(resultData);
finish();
}
}