单击 outside/back 按钮时防止 DialogFragment 消失,而是显示一条消息要求确认
Prevent DialogFragment from dismissing when clicking outside/back button, and show a message asking for confirmation instead
我有一个允许用户输入长消息的 DialogFragment。默认情况下,如果用户在 DialogFragment 或后退按钮外部单击,对话框将关闭并且用户输入将丢失。
如果我使用 "this.isCancelable = false",它会完全阻止后退 button/outside 点击触发,这是我不想要的。
相反,我希望弹出消息与 "Are you sure you want to discard changes" 一起出现,并且仅当用户单击“是”时才关闭 DialogFragment。我应该怎么做?
编辑:也尝试用标志解决这个问题,但仍然有问题。
添加到 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,但会阻止对话框外的任何实际点击?
您可以将 setCanceledOnTouchOutside 布尔值设置为 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 方法中显示您想要用户确认的 toast 或对话框。
希望对您有所帮助!
或
1 为对话框的 window 属性设置 flag-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;
}
找到解决方案,归功于@Unknownweirdo,How to dismiss the dialog with click on outside of the dialog?
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
}
}
我有一个允许用户输入长消息的 DialogFragment。默认情况下,如果用户在 DialogFragment 或后退按钮外部单击,对话框将关闭并且用户输入将丢失。
如果我使用 "this.isCancelable = false",它会完全阻止后退 button/outside 点击触发,这是我不想要的。
相反,我希望弹出消息与 "Are you sure you want to discard changes" 一起出现,并且仅当用户单击“是”时才关闭 DialogFragment。我应该怎么做?
编辑:也尝试用标志解决这个问题,但仍然有问题。
添加到 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,但会阻止对话框外的任何实际点击?
您可以将 setCanceledOnTouchOutside 布尔值设置为 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 方法中显示您想要用户确认的 toast 或对话框。
希望对您有所帮助!
或
1 为对话框的 window 属性设置 flag-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;
}
找到解决方案,归功于@Unknownweirdo,How to dismiss the dialog with click on outside of the dialog?
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
}
}