C# 关闭AlertDialog会发出警告,警告您试图完成输入事件,但输入事件接收器已被释放
我有一个按钮视图,点击按钮我打开了一个警报对话框。我正在使用下面的代码创建它C# 关闭AlertDialog会发出警告,警告您试图完成输入事件,但输入事件接收器已被释放,c#,android,xamarin,mvvmcross,android-alertdialog,C#,Android,Xamarin,Mvvmcross,Android Alertdialog,我有一个按钮视图,点击按钮我打开了一个警报对话框。我正在使用下面的代码创建它 List<String> data = new List<string> { "Hello1", "Hello2", "Hello3", "Hello4" }; void ChangeTubeButton_Click(object sender, EventArgs e) { AlertDialog.Builder builder; bu
List<String> data = new List<string> { "Hello1", "Hello2", "Hello3", "Hello4" };
void ChangeTubeButton_Click(object sender, EventArgs e)
{
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(Context);
builder.SetTitle("Select Tube").SetItems(data.ToArray(), RowSelected);
AlertDialog alert = builder.Create();
alert.Show();
}
void RowSelected(object senderObject, DialogClickEventArgs eventArgs)
{
if (eventArgs.Which >= 0 && eventArgs.Which < data.Count)
{
String selectedHello = data.ElementAt(eventArgs.Which);
}
}
我应该担心这个警告吗?
我想保持我的日志窗口干净。如果有人能提供有关警告的帮助。这与您的代码无关 当您点击屏幕上的outside(外部)时,此
操作\u DOWN
事件排队到应用程序的消息队列中。然后,它通过viewPostimeiInputStage
类传递到AlerDialog
类,最后viewPostimeiInputStage
将此输入事件发送到AlerDialog
的onTouchEvent
侦听器
由于这没有发生在您的AlertDialog
中,因此您的AlerDialog
将调用dismise()
方法:
public boolean onTouchEvent(MotionEvent event)
{
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event))
{
cancel();//This will call dismiss() method.
return true;
}
return false;
}
Dissmiss()
首先尝试关闭AlertDialog
和AlertDialog::onDetachedWindow
调用WindowInputEventReceiver::dispose()
然后viewPostimeiInputStage
调用WindowInputEventReceiver::finishInputEvent
以完成该操作_DOWN
事件。但是,WindowInputEventReceive
r实例已被释放,因此它会抛出警告消息
创建AlertDialog
时,它将与WindowManager
关联,ViewRootImpl
是WindowManager
和DecorView
之间的桥梁(它与AlertDialog的关系如下所示:DecorView->Activity->your AlertDialog)。您可以在AlerDialog
源代码中找到这一点:
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(true);
}
dialog.setOnCancelListener(P.mOnCancelListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
}
Dialog(Context context, int theme, boolean createContextWrapper) {
mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context;
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Window w = PolicyManager.makeNewWindow(mContext);
mWindow = w;
w.setCallback(this);
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
mUiThread = Thread.currentThread();
mListenersHandler = new ListenersHandler(this);
}
以下运动事件“ACTION\u MOVE”无法转移到
AlertDialog
,因为它已被释放,因此ViewRootImpl
将删除ACTION\u MOVE事件
并抛出警告消息。这与您的代码无关
当您点击屏幕上的outside(外部)时,此操作\u DOWN
事件排队到应用程序的消息队列中。然后,它通过viewPostimeiInputStage
类传递到AlerDialog
类,最后viewPostimeiInputStage
将此输入事件发送到AlerDialog
的onTouchEvent
侦听器
由于这没有发生在您的AlertDialog
中,因此您的AlerDialog
将调用dismise()
方法:
public boolean onTouchEvent(MotionEvent event)
{
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event))
{
cancel();//This will call dismiss() method.
return true;
}
return false;
}
Dissmiss()
首先尝试关闭AlertDialog
和AlertDialog::onDetachedWindow
调用WindowInputEventReceiver::dispose()
然后viewPostimeiInputStage
调用WindowInputEventReceiver::finishInputEvent
以完成该操作_DOWN
事件。但是,WindowInputEventReceive
r实例已被释放,因此它会抛出警告消息
创建AlertDialog
时,它将与WindowManager
关联,ViewRootImpl
是WindowManager
和DecorView
之间的桥梁(它与AlertDialog的关系如下所示:DecorView->Activity->your AlertDialog)。您可以在AlerDialog
源代码中找到这一点:
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(true);
}
dialog.setOnCancelListener(P.mOnCancelListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
}
Dialog(Context context, int theme, boolean createContextWrapper) {
mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context;
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Window w = PolicyManager.makeNewWindow(mContext);
mWindow = w;
w.setCallback(this);
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
mUiThread = Thread.currentThread();
mListenersHandler = new ListenersHandler(this);
}
以下运动事件“ACTION\u MOVE”无法转移到
AlertDialog
,因为它已被释放,因此ViewRootImpl
将删除ACTION\u MOVE事件
,并抛出警告消息。@soan saini,关于此问题是否仍有任何疑问?抱歉,无法尽快答复。我是Android开发的新手。所以我希望这是由开箱即用的平台来处理的。因为我没有做任何事情,这是非常定制的。我只是想用平台控件在UI上显示一个带有列表框的警报以供选择。所以我不知道是否实现了这么多额外的代码,我仍在努力理解。值Logcat中的三行。如果我将这些日志保留在应用程序中,我会面临任何问题吗?@soan saini,我发布的上述代码是Android的源代码,只要帮助您理解AlertDialog
的工作流程,保留这些日志就可以了,如果您仍然有问题,请随时联系我。@soan saini,还有问题吗?Shen。非常感谢您的回复。现在我看到了Android内部是如何处理警报对话框的。帮助我更好地理解工作原理。如果我需要任何进一步的帮助,我会与你联系。感谢您的回答。@soan saini,关于这个问题还有什么困惑吗?很抱歉,我无法尽快回复。我是Android开发的新手。所以我希望这是由开箱即用的平台来处理的。因为我没有做任何事情,这是非常定制的。我只是想用平台控件在UI上显示一个带有列表框的警报以供选择。所以我不知道是否实现了这么多额外的代码,我仍在努力理解。值Logcat中的三行。如果我将这些日志保留在应用程序中,我会面临任何问题吗?@soan saini,我发布的上述代码是Android的源代码,只要帮助您理解AlertDialog
的工作流程,保留这些日志就可以了,如果您仍然有问题,请随时联系我。@soan saini,还有问题吗?Shen。非常感谢您的回复。现在我看到了Android内部是如何处理警报对话框的。帮助我更好地理解工作原理。如果我需要任何进一步的帮助,我会与你联系。感谢您的回复。