Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 单击“活动”中的任意位置,查看对话框何时关闭_Android_Xamarin.android_Android Dialog - Fatal编程技术网

Android 单击“活动”中的任意位置,查看对话框何时关闭

Android 单击“活动”中的任意位置,查看对话框何时关闭,android,xamarin.android,android-dialog,Android,Xamarin.android,Android Dialog,我需要在警报对话框关闭的地方运行一些代码,然后单击按钮将其关闭。用户可以通过单击后台活动的某个位置来关闭对话框 我已经设法让它像这样工作: private void InfoAlert() { alert = new Android.App.AlertDialog.Builder(this); alert.SetTitle(Resources.GetString(Resource.String.HiThere)); alert.Se

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

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

    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
};
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)
};
我怎样才能做到这一点


谢谢:)

一种解决方案可能是-但请记住
。setCanceledOnTouchOut(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;  
}  
有关其他可能的解决方案,请参阅:


一种解决方案可能是-但请记住
。setCanceledOnTouchOut(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;  
}  
有关其他可能的解决方案,请参阅:


如果我没弄错,你需要这样处理:

alert.SetOnCancelListener += delegate
{
//do something
};
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)
};

如果我没记错的话,你需要这样处理:

alert.SetOnCancelListener += delegate
{
//do something
};
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)
};

有趣。但我发现实例化第一个类的新对象,然后在第一个类中包含代码行更容易。虽然它多次显示一个新的对话…有趣。但我发现实例化第一个类的新对象,然后在第一个类中包含代码行更容易。虽然它多次显示一个新的对话…效果很好!唯一的问题是我注意到这种方法比我的方法慢得多。但这是一个完美的解决方案。谢谢我不确定性能如何,但我认为这是正确且干净的方法(dialog有Disclose事件,所以我认为我们应该使用它),当然我没有尝试您的解决方案。顺便说一句,对话框并没有那么重,不必担心性能。不管怎样,很高兴能帮忙,很高兴编码!很好!唯一的问题是我注意到这种方法比我的方法慢得多。但这是一个完美的解决方案。谢谢我不确定性能如何,但我认为这是正确且干净的方法(dialog有Disclose事件,所以我认为我们应该使用它),当然我没有尝试您的解决方案。顺便说一句,对话框并没有那么重,不必担心性能。不管怎样,很高兴能帮忙,很高兴编码!