Skip to content

Instantly share code, notes, and snippets.

@Bramengton
Created January 28, 2019 14:13
Show Gist options
  • Select an option

  • Save Bramengton/e00a136a040e653fdeadd7dfa9c68e28 to your computer and use it in GitHub Desktop.

Select an option

Save Bramengton/e00a136a040e653fdeadd7dfa9c68e28 to your computer and use it in GitHub Desktop.
Android, startActivityForResult <-> onActivityResult() in fragment
Одна из самых раздражающих недоработок 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);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment