防止当点击外退按钮时,DialogFragment不显示,而是显示一个要求确认的信息。

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

我有一个DialogFragment,允许用户输入长消息。默认情况下,如果用户在DialogFragment或后退按钮之外点击,对话框将被解散,用户的输入将丢失。

如果我使用 "this.isCancelable = false",就会完全阻止后退按钮外的点击,这是我不想要的。

相反,我想让一个弹出的消息出现 "你确定要放弃更改吗",只有当用户点击是时才会解散DialogFragment。我应该怎么做呢?

编辑:也试过用flags解决,但还是有问题。

在DialogFragment的 "override fun OnResume() "中添加以下内容。

        //FLAG_WATCH_OUTSIDE_TOUCH requires FLAG_NOT_TOUCH_MODAL to work
        dialog?.window?.addFlags(
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
        )
        dialog?.window?.addFlags(
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        )

        dialog?.window?.decorView?.setOnTouchListener { v, event ->
            if (event.action == MotionEvent.ACTION_OUTSIDE) {
                //action to show a message
            }
            true
        }

这种方法的问题是由于FLAG_NOT_TOUCH_MODAL,我现在可以点击对话框后面的项目,这就会弄乱导航控制器并破坏应用程序。是否可以监控MotionEvent.ACTION_OUTSIDE,但防止在对话框外进行任何实际点击?

android kotlin android-dialogfragment android-dialog
1个回答
0
投票

你可以设置 setCanceledOnTouchOutside boolean改为true,并使用下面的方法来处理事件。

dialog.setOnCancelListener(
    new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            //When you touch outside of dialog bounds, 
            //the dialog gets canceled and this method executes.
        }
    }
);

在这个onCancel方法中显示出你想要的吐司或对话框供用户确认。

希望这能帮助你

1 为您的对话框的窗口属性设置标志-FLAG_NOT_TOUCH_MODAL。

Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

2 在windows属性中添加另一个标志FLAG_WATCH_OUTSIDE_TOUCH - 这个标志是为了让对话框在其可见区域之外接收触摸事件。

3 覆盖对话框的onTouchEvent()并检查动作类型,如果动作类型是'MotionEvent.ACTION_OUTSIDE'意味着用户在对话框区域外进行交互。所以在这种情况下,你可以打开另一个对话框进行用户确认。

public boolean onTouchEvent(MotionEvent event)  
{  
       if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  
        System.out.println("TOuch outside the dialog");  
               this.dismiss();  
       }  
       return false;  
}  

0
投票

找到了解决方法,功劳是@未知的怪人。如何通过点击对话框外的按钮来解除对话框?

Kotlin代码。

    override fun onResume() {
        super.onResume()

        dialog?.window?.addFlags(
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
        )

        dialog?.window?.decorView?.setOnTouchListener { v, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                val dialogBounds = Rect()
                v.getHitRect(dialogBounds)
                if (!dialogBounds.contains(event.x.toInt(), event.y.toInt())) {
                    // You have clicked the grey area
                    logicToConfirmDiscardingChange()
                    false // stop activity closing
                }
            }
            true
        }
    }

© www.soinside.com 2019 - 2024. All rights reserved.