我有一个DialogFragment
开始时有动画,我试图在关闭时动画。
我首先添加一个" back"键侦听器,但我的对话框有setCanceledOnTouchOutside(true)
。所以我还想在对话框fragment
之外添加触摸转换。
我尝试的所有方法(AFAIK)都被称为在外部按下对话框后自动关闭。在对话框不在视野之前有没有办法拦截?
编辑:由于提议的解决方案不起作用,这个问题仍未得到解答答案 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
}
}
}
}
}