在解雇之前拦截对话外的接触

时间:2015-12-23 09:00:28

标签: android android-dialogfragment

我有一个DialogFragment开始时有动画,我试图在关闭时动画。

我首先添加一个" back"键侦听器,但我的对话框有setCanceledOnTouchOutside(true)。所以我还想在对话框fragment之外添加触摸转换。

我尝试的所有方法(AFAIK)都被称为在外部按下对话框后自动关闭。在对话框不在视野之前有没有办法拦截?

编辑:由于提议的解决方案不起作用,这个问题仍未得到解答

2 个答案:

答案 0 :(得分:2)

当dialog.setCanceledOnTouchOutside(true);然后你就像这样覆盖onCancel():

null

答案 1 :(得分:0)

这是一种拦截对话框外的触摸和返回键的方法。我使用它进行验证,但您可以用函数替换 isValid() 以启动动画然后关闭对话框。

    fun isValid() = // TODO
    
    // Validate when pressing Back
    dialog.setOnKeyListener { _, keyCode, keyEvent -> // getAction to make sure this doesn't double fire
        if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == KeyEvent.ACTION_UP) {
            !isValid()
        } else false
    }

    // Validate when touching outside to dismiss the dialog
    dialog.window?.let {
        it.callback = object : WindowCallbackWrapper(it.callback) {

            override fun dispatchTouchEvent(event: MotionEvent): Boolean {
                if (isOutOfBounds(event)) {
                    if (!isValid()) {
                        return true
                    }
                }
                return super.dispatchTouchEvent(event)
            }

            private fun isOutOfBounds(event: MotionEvent): Boolean {
                return if (event.action == MotionEvent.ACTION_OUTSIDE) {
                    true
                } else {
                    if (event.action == MotionEvent.ACTION_DOWN) {
                        val x = event.x.toInt()
                        val y = event.y.toInt()
                        val slop = ViewConfiguration.get(context).scaledWindowTouchSlop
                        val decorView: View = it.decorView
                        (x < -slop || y < -slop || x > decorView.width + slop || y > decorView.height + slop)
                    } else {
                        false
                    }
                }
            }
        }
    }