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)是对话框被关闭,即对话框关闭时,包括取消时或屏幕旋转时。
尝试使用 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)是对话框被关闭,即对话框关闭时,包括取消时或屏幕旋转时。