Created
January 28, 2019 14:13
-
-
Save Bramengton/e00a136a040e653fdeadd7dfa9c68e28 to your computer and use it in GitHub Desktop.
Android, startActivityForResult <-> onActivityResult() in fragment
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Одна из самых раздражающих недоработок 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