<rmcreative>

RSS

Все заметки с тегами «Android, startActivityForResult»

  1. Android, фрагмент в фрагменте и startActivityForResult

    12 июня 2014

    Одна из самых раздражающих недоработок 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);
                }
            }
        }
    }
    2 комментария