【问题标题】: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
};

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

谢谢:)

【问题讨论】:

    标签: android xamarin.android android-dialog


    【解决方案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

    【讨论】:

    • 有趣。但我发现实例化我的第一堂课的新对象,然后在我的第一堂课中添加代码行更容易。尽管它多次实例化一个新对话框......
    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多