有没有可能拦截
DialogFragment
中的按键?抱歉这个天真的问题..我的 onBackPressed
的 FragmentActivity
从未被调用过。
提前致谢
if (imageFile.exists()) {
ShowPicDialog newFragment = ShowPicDialog.newInstance();
FragmentTransaction ft = manager.beginTransaction();
Fragment prev = manager.findFragmentByTag("picDialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack("picDialog");
newFragment.getArguments().putString("path", imageFile.getAbsolutePath());
newFragment.show(ft, "picDialog");
}
抱歉,我添加了用于显示对话框的代码片段。
很难确定问题是什么,因为您还没有发布任何代码。但我的第一个猜测是,您尚未通过调用用于将片段添加到活动的
addToBackStack
的 FragmentTransaction
方法将 DialogFragment 添加到返回堆栈。
Android 文档页面中有一些示例,提供了在 Activity 中使用 DialogFragment 的良好模式。
由于您正在显示一个对话框,因此创建的对话框将接收按键事件,而不是父活动。因此,在创建对话框的片段时设置一个
Dialog.OnKeyListener
,并在 setCancelable(false)
上调用 Dialog
以防止后退键将其关闭。然后,您可以在 OnKeyListener
的 onkey
方法中处理后退键。
使用后退按钮处理 DialogFragment 的最佳方法:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), getTheme()){
@Override
public void onBackPressed() {
// On backpress, do your stuff here.
}
};
}
Rahul Pundhir 的答案 效果很好。如果您在对话框中使用构建器模式,您可以这样做:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(...)
.setPositiveButton(...)
.setNegativeButton(...)
.setMessage(...)
.create();
alertDialog.setOnKeyListener((dialog, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_UP) {
// TODO do the "back pressed" work here
return true;
}
return false;
});
return alertDialog;
}
这是通过模仿系统首先如何调用
onBackPressed()
来实现的(忽略 ACTION_UP 的跟踪和侦听)。请参阅 Dialog 上的源代码
您可以将它用于 Dialog/ComponentDialog 和 BottomSheetDialog, 只需用您的对话框类型更改投射的对话框
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return super.onCreateDialog(savedInstanceState).also { dialog ->
//change the ComponentDialog with your type of dialog
(dialog as ComponentDialog).onBackPressedDispatcher.addCallback(this, object :
OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// your code
}
})
}
}