startActivityForResult()总是会导致onActivityResult()之前调用吗?

时间:2014-03-02 21:33:10

标签: android android-fragments android-fragmentactivity

我知道这个问题看起来很模糊,所以请耐心等待。

我正在使用v4支持库处理嵌套片段,并遇到here描述的错误,其中startActivityForResult()的结果未被路由到正确的子片段。在该线程中,用户提出了几种解决方法,其中两个(回复#8#12)描述了基于将请求代码与嵌套片段的路径相关联的解决方案,该片段构成了{{1调用,然后在调用startActivityForResult()时,通过请求代码查找路径并将结果路由到正确的活动。

如果有几个子片段使用相同的请求代码进行调用,这种方法似乎会遇到问题,因为使用该代码将结果路由到哪个子节点是不明确的。但是,如果我们确切地知道每当我们调用onActivityResult()时,startActivityForResult()将始终在片段有机会再次调用onActivityResult()之前调用{<1}},这就不会成为问题。

所以我的问题是,这是一个合理的假设吗?我startActivityForResult()的心理模型是我们暂停当前活动,做其他事情,然后在恢复后立即获得活动结果。这是正确的,还是在某种情况下,startActivityForResult()在恢复后的一段时间后才会被调用?是否有现实情况我会从片段中调用onActivityResult(),然后在从第一个活动得到结果之前从同一片段再次调用它?

1 个答案:

答案 0 :(得分:0)

我相信从您显示的片段中获取结果的最佳方法是在新片段上调用setTargetFragment(),然后,当您打算在新片段中完成结果时,您调用{{3要检查它是否为null,然后调用getTargetFragment()来查找请求代码是什么。然后,您可以直接在目标上调用onActivityResult(),而不是使用通常的方法来设置活动的结果。

所以代码就是这样:

FragmentA.java

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
}

FragmentB.java

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();
    }
}