OnActivityResult не работает внутри фрагмента.Как я могу это исправить в моем коде? - PullRequest
0 голосов
/ 10 июня 2019

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

Вот мой код:

ViewPagerAdapter.class

public class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                return new ConfigurationFragment1();
            case 1:
                return new ConfigurationFragment2();
        }
        return null;
    }
    @Override
    public int getCount() {
        return 2;
    }
}

ConfigurationFragment2.class

public class ConfigurationFragment2 extends Fragment {

    CircularImageView profilePicker;
    EditText user1NameInput;
    Uri profileImageURI;
    Bitmap compressedImageFile;
    Boolean profileImageSet = false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment_configuration_2, container, false);

        profilePicker = rootView.findViewById(R.id.configuration_profile_picker);
        user1NameInput = rootView.findViewById(R.id.configuration_name_1);

        profilePicker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                }
                else if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                }
                else {
                    chooseProfilePicture();
                }
            }
        });
        return rootView;
    }

    public void chooseProfilePicture(){
        CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
        {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if(resultCode == Activity.RESULT_OK)
            {
                assert result != null;
                profileImageURI = result.getUri();
                File thumbnailURI = new File(Objects.requireNonNull(profileImageURI.getPath()));
                try
                {
                    compressedImageFile = new Compressor(getActivity())
                            .setMaxHeight(500)
                            .setMaxWidth(500)
                            .setQuality(100)
                            .compressToBitmap(thumbnailURI);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }

                profilePicker.setImageBitmap(compressedImageFile);
                String profilePictureFolder = "/com.testapp.app/";
                String profilePictureUser1Name = "profilePicUser1.jpg";
                String profilePictureUser1Path = Environment.getExternalStorageDirectory().toString() + profilePictureFolder + profilePictureUser1Name;
                File imagePath = new File(profilePictureUser1Path);
                FileOutputStream fos;

                try {
                    if (!imagePath.exists()) {
                        File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder);
                        wallpaperDirectory.mkdirs();
                    }
                    File file = new File(new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder), profilePictureUser1Name);
                    if (file.exists()) {
                        file.delete();
                    }
                    fos = new FileOutputStream(imagePath);
                    compressedImageFile.compress(Bitmap.CompressFormat.JPEG, 85, fos);
                    fos.flush();
                    fos.close();
                    profileImageSet = true;
                } catch (FileNotFoundException e) {
                    Log.e("eRROR", e.getMessage(), e);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
            {
                assert result != null;
                Exception error = result.getError();
            }
        }
    }
}

и MainActivity.class

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_configuration);
        setTheme(R.style.AppThemeBlueStatusDarkText);
        objectInstance();

        viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.setSwipeable(false);
        viewPager.setCurrentItem(currentPage);
}

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

Код onActivityResult работает безупречно при нормальной активности, но не в этом фрагменте.Как именно я могу решить мою проблему?Спасибо!

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Я считаю, что проблема здесь:

public void chooseProfilePicture(){
    CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
}

Исходный код для этой библиотеки показывает следующее:

public void start(@NonNull Activity activity) {
  mOptions.validate();
  activity.startActivityForResult(getIntent(activity), CROP_IMAGE_ACTIVITY_REQUEST_CODE);
}

Это означает, что аргумент Activity для метода start() будет использоваться для запуска действия CropImage и, следовательно, будет местом, где будет получен результат.Вместо этого вы должны использовать этот другой start() метод, который предоставляет библиотека:

public void start(@NonNull Context context, @NonNull Fragment fragment) {
  fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE);
}

Это означает, что вы будете использовать этот код:

public void chooseProfilePicture(){
    CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity(), this);
}

И теперь результат должен быть доставлен в ваш фрагмент.

0 голосов
/ 10 июня 2019
 firstly you need to add tag to fragment ConfigurationFragment2 when initilaize it the edit onActivityResult in your activity like this :

@Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_configuration);
            setTheme(R.style.AppThemeBlueStatusDarkText);
            objectInstance();

            viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
            viewPager.setAdapter(viewPagerAdapter);
            viewPager.setSwipeable(false);
            viewPager.setCurrentItem(currentPage);
    }

     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            Fragment ConfigurationFragment2 = getSupportFragmentManager().findFragmentByTag("ConfigurationFragment2 Tag");
    switch (requestCode) {
                case  CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE:
    if (ConfigurationFragment2 != null)
                        ConfigurationFragment2.onActivityResult(requestCode, resultCode, data);
                    break;

    }

        }
...