Android中DialogFragment中的onActivityResult从未被调用

3
我想在一个Fragment中,展示一个选择打开相机 / 图库Dialog

当按下一个Button后,我会展示一个自定义的DialogFragment (这个DialogFragmentFragment内部定义的一个内部类)。

public static class AddPictureDialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
        getDialog().setTitle("New Picture");

        Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
        openCameraButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("","Open Camera Option Selected");
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, REQUEST_CAMERA);
                getDialog().dismiss();

            }
        });

        Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
        openGalleryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("","Open Gallery Option Selected");
                Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
                getDialog().dismiss();
            }
        });

        return rootView;
    }

}

选择一个选项后,Camera / Gallery 被初始化,但在拍照或选择图片后,方法 onActivityResult 没有被调用。

下面是创建 DialogFragment 的代码:

FragmentManager fm = getActivity().getSupportFragmentManager();
    AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
    addPictureDialogFragment.show(fm, getTag());

奇怪的是,如果我直接在Fragment中创建DialogFragment而不使用DialogFragment,它就可以运行...
我也尝试过在创建DialogFragment时这样做:
addPictureDialogFragment.setTargetFragment(this, 1);

当初始化cameraIntent时,要这样做:

Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
    openCameraButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("","Open Camera Option Selected");
            getDialog().dismiss();

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            getTargetFragment().onActivityResult(getTargetRequestCode(), 1, intent); 
            startActivityForResult(intent, REQUEST_CAMERA);         
          }
    });
5个回答

4

试试这个:

private void showAddImageDialog() {
    FragmentManager fm = getActivity().getSupportFragmentManager();
    AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
    addPictureDialogFragment.setTargetFragment(this, REQUEST_CAMERA);
    addPictureDialogFragment.show(fm, getTag());
}



public static class AddPictureDialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
        getDialog().setTitle("New Picture");


        Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
        openCameraButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("","Open Camera Option Selected");
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                getTargetFragment().startActivityForResult(intent, getTargetRequestCode());
                getDialog().dismiss();
            }
        });

        Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
        openGalleryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("","Open Gallery Option Selected");
                Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                getTargetFragment().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
                getDialog().dismiss();
            }
        });

        return rootView;
    }

}

2

在你的主活动中,按照以下方式覆盖onActivityResult方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
     if(fragment!=null)
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

有时候,片段可能会被销毁,但引用可能仍然存在,因此需要进行 if(fragment!=null) 检查。

谢谢@Ragesh Ramesh。是的,我知道,但我想要它在“Fragment”中,而不是在“Activity”中。 - Ale
抱歉,我没有注意到。正在更新我的答案。 - Ragesh Ramesh
1
它的工作效率达到了99%。现在onActivityResult方法在Fragment中被调用,但是requestCode是错误的。无论如何,我还是投了你的答案一票,感谢你的时间和努力 :) - Ale
奇怪 - 你发送了什么请求代码,又得到了什么结果。 - Ragesh Ramesh

2
请将以下代码写入您的MainActivity中。
 // In your activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("onActivityResult Main Activity");
        for (Fragment fragment : getSupportFragmentManager().getFragments()) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }

2

这部分很简单

只需要在你的fragment类中调用startActivityForResult(intent,constant); 即可

在activity中重写onActivityResult,不要移除super.onActivityResult(requestCode, resultCode, data);

同时也需要在fragment类中重写onActivityResult

在activity中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "activity result called");
    super.onActivityResult(requestCode, resultCode, data);
}

在代码片段中。
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "fragment result called");
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==constant){
        Logger.d(TAG, "got result");
    }
}

1

在所有片段的父活动中覆盖onActivityResult方法。

在您的主活动中重写此方法:

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

    TestFrag demoFragment = (TestFrag) getSupportFragmentManager().findFragmentByTag("test");
    demoFragment.onActivityResult(requestCode, resultCode, data);
}

在您的片段活动结果调用之后


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接