我正在使用DialogFragment,它将显示完全自定义的视图,没有使用任何本机按钮。 我用dialog.SetCanceledOnTouchOutside(true);将对话框设置为可取消。 当用户触摸外部时,我想运行一些代码来确定是否应关闭该对话框。 我的问题是,当一个事件被触发(取消,关闭)时,即使在super.Dismiss()之前,该对话框也已经被关闭了。所以我永远无法绕过解雇。
我尝试了很多事情,覆盖片段的OnDismiss和OnCancel(触发但延迟),在dialogBuilder上设置侦听器,并在对话框本身上设置OR / OR(未触发或为时太晚),覆盖OnShow以重置听众等...
陷入困境,知道吗?
PS:使用Xamarin
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this.Activity);
alertDialogBuilder.SetView(myView);
AlertDialog dialog = alertDialogBuilder.Create();
dialog.SetCanceledOnTouchOutside(true);
return dialog;
}
public override void OnDismiss(IDialogInterface dialog)
{
//BreakPoint here, already dismissed
base.OnDismiss(dialog);
}
答案 0 :(得分:1)
您想获得这个结果吗?如果您在对话框外部单击,我们可以在对话框关闭之前检测到click事件。
您可以创建load_weights + load_json_architecture
继承MyAlertDialog
AlertDialog
下面的部分是 public class MyAlertDialog:AlertDialog
{
public MyAlertDialog(Context c):base(c) {
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//Please add following code for watching outside touch
this.Window.SetFlags(WindowManagerFlags.NotTouchModal, WindowManagerFlags.NotTouchModal);
this.Window.AddFlags(WindowManagerFlags.WatchOutsideTouch);
}
public override bool OnTouchEvent(MotionEvent e)
{
//just used for testing.
var sss = "test";
//If you want to close the Dialog when click the outside the Dialog part.
//this.Dismiss();
return true;
}
}
。
DialogFragment
单击按钮以推动对话框。
public class MyDialog:Android.Support.V4.App.DialogFragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
MyAlertDialog alertDialogBuilder = new MyAlertDialog(this.Activity);
alertDialogBuilder.SetTitle("MyDialog");
alertDialogBuilder.SetCanceledOnTouchOutside(true);
return alertDialogBuilder;
}
public override void OnPause()
{
base.OnPause();
}
public override void OnCancel(IDialogInterface dialog)
{
base.OnCancel(dialog);
}
public override void OnDismiss(IDialogInterface dialog)
{
base.OnDismiss(dialog);
}
}
答案 1 :(得分:0)
我发现的解决方案是:
仅通过取消按钮关闭片段。做你的东西 取消按钮点击
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
答案 2 :(得分:0)
正确的解决方案非常简单:
dialog?.setCanceledOnTouchOutside(false)
摘自文档:
/**
* Sets whether this dialog is canceled when touched outside the window's
* bounds. If setting to true, the dialog is set to be cancelable if not
* already set.
*
* @param cancel Whether the dialog should be canceled when touched outside
* the window.
*/
答案 3 :(得分:0)
现在你应该使用 DialogFragment 而不是 AlertDialog 所以答案如下:
isCancelable = false
把它放在代码的任何部分,你就为 Java 设置了 setCancelable(false)
答案 4 :(得分:-1)
这应该在onCreateView()
DialogFragment.getDialog().setCanceledOnTouchOutside(true);