Android Fragments DialogFragment和后退按钮

aelbi1ox  于 2023-10-19  发布在  Android
关注(0)|答案(4)|浏览(172)

有没有可能拦截DialogFragment中的按键?对不起,天真的问题。我的FragmentActivityonBackPressed永远不会被调用。
thanks in advance

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

对不起,我添加了我用来显示对话框的代码片段。

ljsrvy3e

ljsrvy3e1#

很难说清楚问题是什么,因为你还没有发布任何代码。但我的第一个猜测是,您没有通过调用FragmentTransactionaddToBackStack方法将DialogFragment添加到回栈,而您正在使用该方法将片段添加到Activity。
在Android文档页面中有一些例子,给予good pattern for using a DialogFragment in your Activity的例子。
由于您正在显示Dialog,因此创建的Dialog将接收按键事件,而不是父Activity。因此,在创建Dialog的片段时设置Dialog.OnKeyListener,并在Dialog上调用setCancelable(false)以防止back键将其关闭。然后可以在OnKeyListeneronkey方法中处理back键。

vyswwuz2

vyswwuz22#

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

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

pkwftd7m3#

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的跟踪和侦听)。查看对话框上的源代码

x6yk4ghg

x6yk4ghg4#

你可以使用它的对话框/会话对话框和底部工作表对话框,只是改变铸造对话框与您的对话框类型

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

相关问题