0

我对 onActivityResult 有疑问。首先,我打开 Add New Message Fragment 以选择图像。当我选择图像时,它不会将结果返回到我当前的片段。我将 onActivityResult 放在 MainActivity 和 AddMessageFragment 中,但它没有在我的片段中调用结果。我的 MainActivity 用于设置导航控制器。我使用 Matisse 库作为我的图像选择器。有人可以帮我吗?被这个问题困扰了一整天。

主要活动

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

添加消息片段

@OnClick({R.id.addImage})
public void openGallery()
{
    permission.addOnStorageListener(new Permission.OnStorageSuccess()
    {
        @Override
        public void OnStorageSuccess()
        {
            permission.requestCamera();
        }
    });
    permission.addOnCameraListener(new Permission.OnCameraSuccess()
    {
        @Override
        public void OnCameraSuccess()
        {
            Matisse.from(getActivity())
                    .choose(MimeType.of(MimeType.JPEG, MimeType.PNG))
                    .countable(false)
                    .capture(true)
                    .captureStrategy(new CaptureStrategy(true, "com.gprop.users.fileprovider"))
                    .maxSelectable(1)
                    .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
                    .thumbnailScale(0.85f)
                    .imageEngine(new Glide4Engine())
                    .originalEnable(false)
                    .forResult(99);
        }
    });
    permission.requestStorage();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 99 && resultCode == Main.RESULT_OK)
    {
            mSelected = Matisse.obtainPathResult(data);

            if(mSelected.size() > 0)
            {
                Glide.with(this).load(mSelected.get(0)).into(addImage);

                Luban.compress(new File(mSelected.get(0)), getActivity().getFilesDir())
                        .putGear(Luban.THIRD_GEAR)
                        .asObservable()
                        .subscribe(new Consumer<File>()
                        {
                            @Override
                            public void accept(File file) throws Exception
                            {
                                newfile = file;
                            }
                        }, new Consumer<Throwable>()
                        {
                            @Override
                            public void accept(Throwable throwable) throws Exception
                            {
                                throwable.printStackTrace();
                                Toast.makeText(getActivity(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        });
            }
            else
            {
                Toast.makeText(getActivity(), "No image selected", Toast.LENGTH_SHORT).show();
            }

        }
}

在此处输入图像描述

4

3 回答 3

4

您正在调用您Matisse.from()ActivitygetActivity()方法中获取的内容,tit 必须返回您的内容MainActivity,并且您onActivityResultMainActivity在您无所事事的地方调用super.onActivityResult().

可能的解决方案:

  1. 将您的onActivityResult代码逻辑从您AddMessageFragmentMainActivity
  2. 将您Matisse的调用从更改Matisse.from(getActivity())Matisse.from(this),因为查看它的源代码Matisse也支持 Fragment 上下文。

使用第二种解决方案,您应该onActivityResult在片段中获取回调,并且您不需要更改/移动任何其他代码逻辑。

希望这可以帮助 :)

于 2019-12-23T10:43:05.613 回答
0

从 fragment 到 onActivityResult 函数的显式调用如下。

在父 Activity 类中,重写 onActivityResult() 方法,甚至在 Fragment 类中重写,并调用如下代码。

MainActivity类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.layoutContainer);
    fragment.onActivityResult(requestCode, resultCode, data);
}

AddMessageFragment类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}
于 2019-12-23T10:34:09.880 回答
0

用以下代码替换您的活动 onActivityResult 方法

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

执行此操作后,它将调用您的片段 onActivityResult。

于 2019-12-23T10:44:38.503 回答