关闭 AlertDialog 给出警告 Attempted to finish an input event but the input event receiver has already been disposed

Dismissing a AlertDialog gives warning Attempted to finish an input event but the input event receiver has already been disposed

我有一个带按钮的视图,单击按钮我打开了一个警报对话框。我正在使用以下代码创建

    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);
        }
    }

警报正确显示在 UI 上,并且能够正确地 select 行。只是当我在屏幕上点击外部时。警报解除,但在 Logcat.

中发出警告
[InputEventReceiver] Attempted to finish an input event but the input event receiver has already been disposed.
[ViewRootImpl[NavigationView]] Dropping event due to root view being removed: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=133.8952, y[0]=-190.78308, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=88925144, downTime=88925129, deviceId=1, source=0x1002 }
[InputEventReceiver] Attempted to finish an input event but the input event receiver has already been disposed.

我应该关注这个警告吗? 我想保持我的日志 window 干净。如果有人可以就警告提供帮助。

这与您的代码无关。

当您点击屏幕外部时,此 ACTION_DOWN 事件会排入应用程序的消息队列。然后通过ViewPostImeInputStageclass传递给你的AlerDialogclass,最后ViewPostImeInputStage把这个输入事件传递给AlerDialogonTouchEvent 】 听众。

因为这没有发生在您的 AlertDialog 中,您的 AlerDialog 将调用 dismiss() 方法:

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()

然后 ViewPostImeInputStage 调用 WindowInputEventReceiver::finishInputEvent 来完成那个 ACTION_DOWN 事件。但是 WindowInputEventReceiver 实例已被处理,因此它会抛出警告消息。

当你创建一个AlertDialog时,它会关联一个WindowManagerViewRootImplWindowManagerDecorView之间的桥梁(它与你的 AlertDialog 像这样:DecorView -> Activity -> 你的 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_MOVE" 传递给 AlertDialog,因为它已被处理,因此 ViewRootImplDropping ACTION_MOVE event 并抛出警告消息。