如何防止DialogFragment在外部触摸时消失?

问题描述 投票:1回答:3

我正在使用DialogFragment,它将显示完全自定义的视图,未使用任何本机按钮。我用dialog.SetCanceledOnTouchOutside(true);将对话框设置为可取消。当用户触摸外部时,我想运行一些代码来确定是否应关闭该对话框。我的问题是,当一个事件被触发(取消,关闭)时,即使在super.Dismiss()之前,该对话框也已经被关闭了。因此我永远无法绕过解雇。

我尝试了很多事情,重写该片段的OnDismiss和OnCancel(被触发但延迟),在dialogBu​​ilder上设置侦听器,并在对话框本身上设置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);
}
android xamarin modal-dialog android-dialogfragment
3个回答
0
投票

我发现的解决方案是:

仅通过取消按钮关闭片段。做你的东西取消按钮单击

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 ();
}

0
投票

您想获得这个结果吗?如果您在对话框外部单击,我们可以在对话框关闭之前检测到click事件。enter image description here

您可以创建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");
    }

-1
投票

应该在onCreateView()上调用

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
© www.soinside.com 2019 - 2024. All rights reserved.