startActivityforResult из фрагмента - получить изображение из галереи

У меня есть регистр активности, в котором есть контейнер фрагментов в качестве пейджера с использованием fragmentpageradapter. это что-то вроде волшебной формы с кнопками «следующая» и «предыдущая».

Во втором фрагменте внутри пейджера я пытаюсь получить изображение из галереи с помощью этого кода:

private void getAvaFromGallery() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_PICK);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), RESULT_LOAD_IMAGE);
}
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode,data);
        if(resultCode == getActivity().RESULT_OK) {
            if (requestCode == RESULT_LOAD_IMAGE) {
                CompressBitmap cb = new CompressBitmap(getActivity());
                selectedImageUri = cb.handleImageUri(data.getData());
                String filepath = cb.getFilename();
                bitmap = cb.compressImage(cb.getRealPathFromURI(getActivity(), selectedImageUri), filepath);
                photo.setImageBitmap(bitmap);
                Log.d("FilePath", filepath);
            }
        }
    }

после получения данных я пытаюсь сжать их в png и поместить в изображение. но я думаю, что onactivityresult в этом случае не вызывается.

я пробовал только с фрагментом внутри активности, и это работа. но в моем случае фрагмент находится внутри фрагмента с адаптером пейджера.

Я надеюсь, что кто-то может помочь мне ..


person Ibnu Habibie    schedule 06.01.2016    source источник
comment
stackoverflow.com/ вопросы/13580075/   -  person Uriel Frankel    schedule 06.01.2016


Ответы (1)


Я также столкнулся с подобной проблемой. Ниже приведено решение, которое сработало для меня. Код был для DrawerActivity, но я использовал FragmentPagerAdapter в DrawerActivity.

  • Прежде всего, если вы вызываете startActivityForResult(), не вызывайте этот метод напрямую. Вместо этого вызовите getParentFragment().startActivityForResult() в дочернем фрагменте.
  • Реализуйте onActivityResult() в обычном режиме без каких-либо изменений в дочернем фрагменте.
  • Теперь в основном действии, которое является родителем как для родительского, так и для дочернего фрагментов (в моем случае для действия Drawer), реализуйте приведенный ниже код в onActivityResult(), который перемещает результат действия ко всем его дочерним фрагментам.

    for (Fragment fragment : getSupportFragmentManager().getFragments())
        {
            if (fragment != null)
            {
                fragment.onActivityResult(p_requestCode, p_resultCode, p_data);
            }
        }
    
  • В onactivityresult() родительского фрагмента нам снова нужно реализовать код для вызова onActivityResult() для его дочерних фрагментов.

List<Fragment> fragments = getChildFragmentManager().getFragments();
            if (fragments != null)
        {
            for (Fragment fragment : fragments)
            {
                Log.e("SupportFragment", fragment.getClass().getSimpleName());
                if(fragment instanceof ContactUsFragment)
                {
                    fragment.onActivityResult(p_requestCode, p_resultCode, p_data);
                }
            }
        }

Примечание. Код и фрагменты взяты из решения, предоставленного здесь

Надеюсь, поможет...

person Android Team    schedule 06.01.2016
comment
Я пробовал ваш код, и я получаю эту ошибку. У меня есть еще один фрагмент, который использует ту же активность для входа через api facebook. Попытка вызвать метод интерфейса 'boolean com.facebook.CallbackManager.onActivityResult(int, int, android.content.Intent)' для нулевой ссылки на объект - person Ibnu Habibie; 06.01.2016
comment
Метод onActivityResult(), при котором вы получаете сообщение об ошибке, относится к Facebook. Мы вызываем метод onActivityResult() действия. вам нужен какой-то механизм для разделения этих методов обратного вызова - person Android Team; 07.01.2016