通过单击 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)
};
我需要 运行 一些代码来关闭我的警报对话框,然后通过单击按钮将其关闭。用户可以通过单击背景中 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)
};