Android 从未从 Fragment 中的 DialogFragment 调用过 onActivityResult

Android onActivityResult never called from DialogFragment in Fragment

我想显示 Dialog,以便在 Fragment 中选择打开 Camera / Gallery

按下Button后,我显示一个自定义的DialogFragment(这个DialogFragmentinnerclass里面的Fragment ).

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

和这个,当初始化 camera Intent:

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

在你的主要 activity 中覆盖 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) 检查。

请将此代码写入您的 Main Actvity。

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

覆盖 Activity 父级 Activity 的结果,即所有片段的父级

在您的 Main 上覆盖此方法 activity :

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

在您的片段 activity 结果调用之后

这部分很简单

只要打电话startActivityForResult(intent,constant); 在你片段 class

覆盖 activity 中的 onActivityResult 并且不删除 super.onActivityResult(requestCode, resultCode, data);

也覆盖片段 class

中的 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");
    }
}

试试这个:

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

}