通过单击活动中的任意位置找出对话框何时关闭

Posted

技术标签:

【中文标题】通过单击活动中的任意位置找出对话框何时关闭【英文标题】:Find out when Dialog has been closed by clicking anywhere in the activity 【发布时间】:2018-09-15 01:04:22 【问题描述】:

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

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

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

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

alert.SetOnCancelListener += delegate

//do something
;

我将如何实现这样的目标?

谢谢:)

【问题讨论】:

【参考方案1】:

如果我理解正确,你需要像这样处理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)
;

【讨论】:

效果很好!唯一的事情是我注意到这种方式比我的方法慢得多。但这是一个完美的解决方案。谢谢! 我不确定性能,但我认为这是正确且干净的方式,(对话框有关闭事件,所以我们应该使用它,我认为),当然我没有试试你的解决方案。顺便说一句,对话框并不那么担心性能。无论如何很乐意提供帮助,祝您编码愉快!【参考方案2】:

一个解决方案可能是 - 但请记住 .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

【讨论】:

有趣。但我发现实例化我的第一堂课的新对象,然后在我的第一堂课中添加代码行更容易。尽管它多次实例化一个新对话框......

以上是关于通过单击活动中的任意位置找出对话框何时关闭的主要内容,如果未能解决你的问题,请参考以下文章

打开具有对话框的活动时应用程序关闭在背景中(样式Theme.Dialog)

如何检测何时单击文件输入的取消?

何时显示对话框[重复]

警报对话框中的可单击文本链接以打开活动

地理位置,共享位置对话框

如何通过单击对话框外部来关闭对话框?