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

时间:2019-12-19 09:54:39

标签: android xamarin modal-dialog android-dialogfragment

我正在使用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);
}

5 个答案:

答案 0 :(得分:1)

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

您可以创建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);
相关问题