【问题标题】:OnActivityResult does not work inside fragment. How can I fix this on my code?OnActivityResult 在片段内不起作用。我怎样才能在我的代码上解决这个问题?
【发布时间】:2019-06-10 20:30:14
【问题描述】:

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

【问题讨论】:

  • 问题在于这个奇怪的CropImage 库。您必须使用Fragment.startActivityForResult,但该库可能正在使用Activity.startActivityForResult,因此它没有正确转发到片段。

标签: java android onactivityresult


【解决方案1】:

我相信问题出在这里:

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 活动,因此将是接收结果的地方。相反,您应该使用库公开的其他 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。

【讨论】:

  • 妈的,就这么简单。我必须学习如何查看我使用的库的文档,但我认为这比这更复杂。非常感谢你,伙计。
  • 不用担心。狩猎愉快!
【解决方案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;

    }

        }

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2020-11-28
    • 2019-11-21
    • 2019-04-10
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多