DialogFragment和后退按钮

时间:2011-10-01 18:10:47

标签: android android-fragments

是否有可能拦截DialogFragment中的关键按钮?对于天真的问题感到抱歉..我的onBackPressed的{​​{1}}从未被调用过。

提前致谢

FragmentActivity
抱歉,我添加了用于显示对话框的代码片段。

3 个答案:

答案 0 :(得分:29)

由于您尚未发布任何代码,因此很难确定问题是什么。但我的第一个猜测是,你没有通过调用你用来将片段添加到活动的addToBackStack的{​​{1}}方法将DialogFragment添加到后台。

Android文档页面中有一些示例提供了good pattern for using a DialogFragment in your Activity

的示例

由于您正在显示对话框,因此创建的对话框将接收关键事件,而不是父活动。因此,在创建Dialog的片段时设置FragmentTransaction,并在Dialog.OnKeyListener上调用setCancelable(false)以防止后退键将其解除。然后,您可以使用Dialog的{​​{1}}方法处理后退键。

答案 1 :(得分:5)

使用后退按钮处理DialogFragment的最佳方法:

mpgv

答案 2 :(得分:3)

如果您不使用构建器模式,

Rahul Pundhir's answer会很有效。如果您在对话框中使用Builder模式,则可以执行以下操作:

    @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)来实现。见the source on Dialog