DialogFragment和后退按钮

Bla*_*elt 28 android android-fragments

是否有可能拦截钥匙扣DialogFragment?抱歉天真的问题...... onBackPressedFragmentActivity的永远不会被召唤.

提前致谢

    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");
        }
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*run 31

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

Android文档页面中有一些示例提供了在Activity中使用DialogFragment良好模式示例 .

由于您正在显示对话框,因此创建的对话框将接收关键事件,而不是父活动.因此,Dialog.OnKeyListener在创建Dialog的片段时设置一个,并调用setCancelable(false)Dialog以防止后退键解除它.然后,您可以处理您的返回键OnKeyListeneronkey方法.


小智 7

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new Dialog(getActivity(), getTheme()){
        @Override
        public void onBackPressed() {
            // On backpress, do your stuff here.
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


tir*_*r38 5

如果您不使用构建器模式,那么Rahul Pundhir的答案非常有用。如果您在对话框上使用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;
    }
Run Code Online (Sandbox Code Playgroud)

通过模仿系统一开始的调用方式onBackPressed()(忽略跟踪和监听ACTION_UP)来工作。在Dialog上查看源代码