OnActivityResult 在片段内部不起作用。我怎样才能在我的代码上解决这个问题?

OnActivityResult does not work inside fragment. How can I fix this on my code?

所以我正在编写这个应用程序,它需要从 phone 中选择一张个人资料图片,裁剪、压缩并将图片保存到内存中的自定义位置,并将压缩位图设置为预览在圆形图像视图中。所有这一切都在一个片段中。但是我的 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 代码在正常 activity 中完美运行,但在此片段中则不然。我究竟该如何解决我的问题?谢谢!

 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;

    }

        }

我认为问题出在这里:

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

source code for this library 显示如下:

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

这意味着 start() 方法的 Activity 参数将用于启动 CropImage activity,因此将是接收结果的地方。相反,您应该使用库公开的其他 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);
}

现在结果应该传送到您的 Fragment。