通过单击 activity 中的任意位置查看对话框何时关闭

Find out when Dialog has been closed by clicking anywhere in the activity

我需要 运行 一些代码来关闭我的警报对话框,然后通过单击按钮将其关闭。用户可以通过单击背景中 activity 的某处来关闭对话框。

我已经设法让它像这里一样工作了:

    private void InfoAlert()
    {
        alert = new Android.App.AlertDialog.Builder(this);
        alert.SetTitle(Resources.GetString(Resource.String.HiThere));
        alert.SetMessage(Resources.GetString(Resource.String.BetaGame));

        alert.SetNeutralButton(Resources.GetString(Resource.String.GotIt), (senderAlert, args) =>
        {
            var activity2 = new Intent(this, typeof(Activity_Login));
            StartActivity(activity2);
            Finish();
        });


        alert.SetOnCancelListener(new ProgressDialogCancel(this, this));
        Dialog dialog = alert.Create();
        dialog.Show();

    }

public class ProgressDialogCancel : Java.Lang.Object, IDialogInterfaceOnCancelListener
{
    private Context _context;
    private readonly Activity _activity;

    public ProgressDialogCancel(Context context, Activity activity)
    {
        _context = context;
        _activity = activity;
    }

    public void OnCancel(IDialogInterface dialog)
    {
        Activity_AcctCreationLogin.btnInsta.Visibility = ViewStates.Visible;
        Activity_AcctCreationLogin.btnFB.Visibility = ViewStates.Visible;
        Activity_AcctCreationLogin.btnCreateAccount.Visibility = ViewStates.Visible;
        Activity_AcctCreationLogin.btnExplain.Visibility = ViewStates.Visible;
        Activity_AcctCreationLogin.btnLogin.Visibility = ViewStates.Visible;
        Activity_AcctCreationLogin.ln1.SetBackgroundResource(0);
        Activity_AcctCreationLogin.ln1.SetBackgroundColor(Color.ParseColor("#ffffff"));
        Activity_AcctCreationLogin.alert.Dispose();
    }
}

但由于我需要 运行 来自另一个 class 的大量代码,这是一个非常不干净的解决方案。理想情况下,会有这样的方法:

alert.SetOnCancelListener += delegate
{
//do something
};

我怎样才能实现这样的目标?

谢谢:)

一个解决方案可能是 - 但请记住 .setCanceledOnTouchOutside(true) 必须在 onCreate 方法中调用

Dialog dialog = new Dialog(context)
      dialog.setCanceledOnTouchOutside(true);

或覆盖 onTouchEvent() 并检查操作类型。如果操作类型是 'MotionEvent.ACTION_OUTSIDE' 意味着用户在对话区域之外进行交互。所以在这种情况下,您可以关闭对话框

public boolean onTouchEvent(MotionEvent event)  
{
       if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  
        System.out.println("dismiss dialog");  
               this.dismiss();  
       }  
       return false;  
}  

其他可能的解决方案请参考: How to dismiss a DialogFragment when pressing outside the dialog?

Allow outside touch for DialogFragment

如果我没听错,你需要这样处理DismissEvent

var dialog = new Dialog(CONTEXT);
// SetContentView, SetTitle, ...

dialog.DismissEvent += (s, e) =>
{
    // do whatever you need here, this will be called on
    // dismiss (clicking on cancel button or outside of dialog)
};