Android 对话框片段和返回按钮

Android 对话框片段和返回按钮,android,android-fragments,Android,Android Fragments,是否有可能截获对话框片段中的按键?对不起,这个天真的问题。。从不调用myFragmentActivity的onBackPressed 提前谢谢 if (imageFile.exists()) { ShowPicDialog newFragment = ShowPicDialog.newInstance(); FragmentTransaction ft = manager.beginTransaction(); Fr

是否有可能截获
对话框片段
中的按键?对不起,这个天真的问题。。从不调用my
FragmentActivity
onBackPressed

提前谢谢

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

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

很难说问题出在哪里,因为您没有发布任何代码。但我的第一个猜测是,您没有通过调用
FragmentTransaction
addToBackStack
方法将DialogFragment添加到后堆栈中,您正在使用该方法将片段添加到活动中

Android文档页面中有一些例子,给出了一个示例


因为您正在显示一个对话框,所以创建的对话框将接收关键事件,而不是父活动。因此,在创建对话框片段时设置一个
Dialog.OnKeyListener
,并在
对话框上调用
setCancelable(false)
,以防止back键将其取消。然后,您可以在
OnKeyListener
onkey
方法中处理back键。

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new Dialog(getActivity(), getTheme()){
        @Override
        public void onBackPressed() {
            // On backpress, do your stuff here.
        }
    };
}
如果不使用构建器模式,则效果非常好。如果在对话框中使用生成器模式,则可以执行以下操作:

    @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()
的方式来实现的(忽略跟踪和监听操作)。请参见

您是在使用兼容性库,还是在蜂窝设备/仿真器上进行测试?我用更多信息更新了我的答案。简而言之,当您创建一个对话框时,它会创建一个新的活动,因此FragmentActivity不再接收关键事件。您需要在DialogFragment中设置对话框,以便它为您处理back键。您是指
setCancelable
而不是
isCancelable