【问题标题】:Force correct onActivityResult method call - Android强制正确 onActivityResult 方法调用 - Android
【发布时间】:2018-05-29 18:13:51
【问题描述】:

我有一个加载 DialogFragment 的 Fragment。加载的 DialogFragment 是一种弹出式样式,允许用户选择照片或从相机中拍摄照片。我的 DialogFragment 类中有一个 onActivityResult 方法,我想在他们拍摄照片或从图库中选择照片时调用它。

问题是,我在父 Fragment 中也有一个 onActivityResult。我添加了它,以便在创建对话框时设置目标片段,然后在关闭对话框时获取回调,以便我知道执行其他操作。

我用它在我的主要片段中显示 DialogFragment...

DialogFragment profilePhotoChoose = new ProfilePhotoChoose();
profilePhotoChoose.setShowsDialog(true);
profilePhotoChoose.setCancelable(false);
profilePhotoChoose.setTargetFragment(MyMainFragment.this, REQUEST_CODE); // request code is simply int value
profilePhotoChoose.show(getActivity().getSupportFragmentManager(), "dialogPhotoChoose");

发生的情况是,主片段的 onActivityResult 方法被触发,而不是对话框片段的 onActivityResult。

如何确保它调用正确的?我是否需要向触发相机或图库的意图添加一些内容?

更新

这是我用于从 DialogFragment 中启动相机意图的代码。请注意,我正在使用支持 DialogFragment。

Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if(pictureIntent.resolveActivity(getActivity().getPackageManager()) != null){
                    try {
                        File file = .... // file stuff here
                        if (file != null) {
                            Uri photoURI = FileProvider.getUriForFile(getActivity(),"com.MYAPPID.android.provider", file);
                            pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                            startActivityForResult(pictureIntent, REQUEST_CAPTURE_IMAGE);
                        }
                    } catch (Exception ex) {

                    }
                }

【问题讨论】:

  • 我刚刚意识到您的问题是仅将某些请求转发到您的片段,我稍微编辑了我的问题,我相信您可以在重定向之前在您的活动onActivityResult 中添加对requestCode 的检查它到某个片段,例如,如果requestCode 为 1,则转到父片段,如果为 2,则转到子片段

标签: android android-fragments android-intent


【解决方案1】:

由于首先在 Activity 中接收到事件,因此您需要将其重定向到您的 Fragment,因此在您的 Activity 中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);
    Fragment yourChildFragment = getSupportFragmentManager().findFragmentByTag("YOUR_TAG");
    yourChildFragment.onActivityResult(requestCode, resultCode, data);
}

这应该调用您的片段 onActivityResult。如果您想将其转发到特定呼叫,您可以尝试添加 requestCode 检查。

【讨论】:

    【解决方案2】:

    您不需要在 DialogFragment 中使用 onActivityResult() 而是可以在主片段 onActivityResult() 方法中检查请求代码,例如 开始你的意图是这样的:

    startActivityForResult(intent, REQUEST_CODE);
    

    并在 onActivityResult() 方法中检查请求代码:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request we're responding to
        if (requestCode == PICK_CONTACT_REQUEST) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
                // The user picked a contact.
                // The Intent's data Uri identifies which contact was selected.
    
                // Do something with the contact here (bigger example below)
            }
        }
    }
    

    【讨论】:

    • 我使用 DialogFragment 中的 onActivityResult 来修改对话框本身的元素,所以我需要它。我只需要在关闭对话框时才调用父片段中的那个。
    • 您能否分享您在对话框片段中启动意图的代码和对话框片段的onActivityResult?
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多