我正在使用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);
}
我发现的解决方案是:
仅通过取消按钮关闭片段。做你的东西取消按钮单击
dialog.Cancelable = false;
_cancelButton =dialog.FindViewById(Resource.Id.btnOptionOne );
_cancelButton.Click += CancelButtonPositiveButtonClick;
private void CancelButtonPositiveButtonClick (object sender, EventArgs e) {
//do something here and dismiss the dialog if you want to:
if (satisfied) {
DismissDialog();
}
}
private void DismissDialog () {
_cancelButton.Click -= CancelButtonPositiveButtonClick;
dialog.Dismiss ();
}
您想获得这个结果吗?如果您在对话框外部单击,我们可以在对话框关闭之前检测到click事件。
您可以创建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);
}
}
单击按钮以推动对话框。
private void BtnClick_Click(object sender, System.EventArgs e)
{
MyDialog dialog = new MyDialog();
dialog.Show(SupportFragmentManager, "dialog");
}
应该在onCreateView()
上调用
DialogFragment.getDialog().setCanceledOnTouchOutside(true);