关闭 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
事件会排入应用程序的消息队列。然后通过ViewPostImeInputStage
class传递给你的AlerDialog
class,最后ViewPostImeInputStage
把这个输入事件传递给AlerDialog
的onTouchEvent
】 听众。
因为这没有发生在您的 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
事件。但是 WindowInputEventReceive
r 实例已被处理,因此它会抛出警告消息。
当你创建一个AlertDialog
时,它会关联一个WindowManager
,ViewRootImpl
是WindowManager
和DecorView
之间的桥梁(它与你的 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
,因为它已被处理,因此 ViewRootImpl
将 Dropping ACTION_MOVE event
并抛出警告消息。
我有一个带按钮的视图,单击按钮我打开了一个警报对话框。我正在使用以下代码创建
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
事件会排入应用程序的消息队列。然后通过ViewPostImeInputStage
class传递给你的AlerDialog
class,最后ViewPostImeInputStage
把这个输入事件传递给AlerDialog
的onTouchEvent
】 听众。
因为这没有发生在您的 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
事件。但是 WindowInputEventReceive
r 实例已被处理,因此它会抛出警告消息。
当你创建一个AlertDialog
时,它会关联一个WindowManager
,ViewRootImpl
是WindowManager
和DecorView
之间的桥梁(它与你的 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
,因为它已被处理,因此 ViewRootImpl
将 Dropping ACTION_MOVE event
并抛出警告消息。