Одна из самых раздражающих недоработок Android проявляется когда нужно из фрагмента получить изображение с камеры или выбрать из готовых. Для этого используется Fragment.startActivityForResult()
, а результат приходит в Fragment.onActivityResult()
. Всё бы хорошо, но если фрагмент является потомком другого фрагмента, onActivityResult()
не вызывается. Решается не очень тривиально:
startActivityForResult()
вызываем не для текущего фрагмента, а для родителя:
private Fragment getActivityStarterFragment() { if (getParentFragment() != null) { return getParentFragment(); } return this; } getActivityStarterFragment().startActivityForResult(...);
В фрагменте-родителе явно вызываем onActivityResult()
потомков:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callOnActivityResultOnChildFragments(this, requestCode, resultCode, data); } // реализовано коллегами после изучения https://gist.github.com/artem-zinnatullin/6916740 public static void callOnActivityResultOnChildFragments(Fragment parent, int requestCode, int resultCode, Intent data) { FragmentManager childFragmentManager = parent.getChildFragmentManager(); if (childFragmentManager != null) { List<Fragment> childFragments = childFragmentManager.getFragments(); if (childFragments == null) { return; } for (Fragment child : childFragments) { if (child != null && !child.isDetached() && !child.isRemoving()) { child.onActivityResult(requestCode, resultCode, data); } } } }