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内部是如何处理警报对话框的。帮助我更好地理解工作原理。如果我需要任何进一步的帮助,我会与你联系。感谢您的回复。