DialogFragment 中的 onBackPressed 和 onCancel 有什么区别?

What is the difference between onBackPressed and onCancel in DialogFragment?

尝试使用 dialog fragment

的后退按钮时

我很好奇使用 onBackPressed()(或 onBackPressedCallBack)和 onCancel() 之间的区别。

我尝试在dialog fragment中使用onBackPressedCallback()OnBackPressedDispatcher()来定义back key的数据转发事件,但是没有成功。

最后,我使用onCancel()传递了数据。

为什么 onBackPressed() 的后退键不起作用?

已更新

public class WritingCommentDialogFragment extends DialogFragment {
    OnBackPressedCallback callback;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        return view;
    }
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setCanceledOnTouchOutside(false);
        return dialog;
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        callback =  new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                Toast.makeText(getContext(), "TEST", Toast.LENGTH_SHORT).show();
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
    }

}

onBackPressed() 对话框本身拦截了主机 Activity 之前按下的后退按钮。默认行为是在对话框上调用 cancel() 而不是将其传递给 Activity。这就是为什么将回调添加到 Activity 没有做任何事情。如果你想专门处理后退按钮按下,你需要 subclass 对话框来覆盖它并使用那个 class 作为你在 onCreateDialog() 中创建的对话框。像这样:

public class MyDialogFragment extends DialogFragment {

    @NotNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = new Dialog(requireContext(), getTheme()) {
            @Override
            public void onBackPressed() {
                MyDialogFragment.this.onBackPressed();
                // And maybe you also want to call cancel() here.
            }
        };
        dialog.setCanceledOnTouchOutside(false);
        return dialog;
    }

    private void onBackPressed() {
        // your code here
    }
}

对话框不仅在按下后退键时被取消,而且如果用户点击对话框外部或按下取消按钮(如果您向对话框中添加了一个),或者如果您手动调用 cancel()在它或其宿主 DialogFragment 上。因此,在 onCancel() 中执行您的操作涵盖了比按下后退按钮更多的事件。

您可以挂接的第三个可能事件(使用 OnDismissListener)是对话框被关闭,即对话框关闭时,包括取消时或屏幕旋转时。