DialogFragment 和后退按钮

问题描述 投票:0回答:4

有没有可能拦截

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

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

android android-fragments
4个回答
33
投票

很难确定问题是什么,因为您还没有发布任何代码。但我的第一个猜测是,您尚未通过调用用于将片段添加到活动的

addToBackStack
FragmentTransaction
方法将 DialogFragment 添加到返回堆栈。

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

由于您正在显示一个对话框,因此创建的对话框将接收按键事件,而不是父活动。因此,在创建对话框的片段时设置一个

Dialog.OnKeyListener
,并在
setCancelable(false)
上调用
Dialog
以防止后退键将其关闭。然后,您可以在
OnKeyListener
onkey
方法中处理后退键。


14
投票

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

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

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

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 上的源代码


0
投票

您可以将它用于 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
            }
        })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.