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事件,所以我认为我们应该使用它),当然我没有尝试您的解决方案。顺便说一句,对话框并没有那么重,不必担心性能。不管怎样,很高兴能帮忙,很高兴编码!