有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OnActivityResult在片段中不起作用。如何在我的代码中修复此问题?

因此,我正在编写这个应用程序,它需要从手机中拾取个人资料图片,裁剪、压缩并将图片保存到内存中的自定义位置,还需要将压缩后的位图设置为圆形图像视图中的预览。所有这些都在一个碎片里。但是我的onActivityResult在片段中根本没有被调用

这是我的密码:

查看页面雷达。类

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;
    }
}

配置碎片2。类

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();
            }
        }
    }
}

主要活动。类

 @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. # 1 楼答案

    我认为问题在于:

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

    {a1}显示以下内容:

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

    这意味着start()方法的Activity参数将用于启动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);
    }
    

    现在,结果应该传递给你的片段

  2. # 2 楼答案

     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;
    
        }
    
            }