我可能有一个可行的解决方案,因为我曾经处于非常相似的情况。
简而言之,我不再依赖Fragment的onActivityResult(),而是自己实现了一个工作逻辑。
您应该信任的唯一onActivityResult() 是您的Activity。
你可以像这个一样创建interface
public interface ActivityResultDispatcher {
// Pass anything you want, Bundle, Intent, ecc...
// For the sake of simplicity I'm using Bundle...
public void dispatchResultData(final Bundle data);
}
并让您的 Fragment 类实现它。
你的Activity 和你的primary Fragment之间的沟通应该很容易,你可以做这样的事情(在你的Activity):
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
final Bundle bundle = new Bundle();
// put data inside Bundle
this.primaryFrament.dispatchResultData(bundle);
}
现在,您的主要Fragment 是拥有ViewPager 和其他Frament 类的那个。
所以在你的主Fragment 你会这样做:
@Override public void dispatchResultData(final Bundle data) {
for (int i = 0; i < MyViewPager.NUM_FRAGMENTS; i++) {
final ActivityResultDispatcher subFragment = (ActivityResultDispatcher) this.retrieveFragment(i);
// some fragments in ViewPager may be dynamically deleted
if (subFragment != null) {
subFragment.dispatchResultData(data);
}
}
}
retrieveFragment(final int position) 函数是我在网上找到的一段非常舒适的代码。
ViewPager 的实现如下:
public Fragment retrieveFragment(final int position) {
return this.fragmentManager.findFragmentByTag("android:switcher:" + R.id.my_pager_id + ":" + position);
}
您在ViewPager 中的所有活动Fragment 课程都将收到Bundle,您可以决定如何处理它。
您可以将更多信息传递给调度员,例如
public void dispatchResultData(final Bundle data, final int requestCode);
并让您的 Fragment 决定它是否应该响应函数调用。
您基本上已经构建了一个完整的功能齐全的onActivityResult() 实用程序,并且可以确保您的所有Fragments(如果已实例化)都会收到结果。