TooltipCompat 导致 BadTokenException
TooltipCompat causing BadTokenException
我创建了一个显示按钮列表的 PopupWindow
。最初,对于我列表中的每个项目,我实现了一个 OnLongClickListener
以在视图持有者中显示一条 Toast
消息:
private inner class MenuItemViewHolder (itemView: View) {
val button: ImageButton = itemView.findViewById(R.id.button);
fun bindItem(item: MenuItem) {
button.setImageDrawable(item.icon)
button.isEnabled = item.isEnabled
button.setOnClickListener { popupWindow.onItemClick(item) }
button.setOnLongClickListener {
Toast.makeText(context, item.title, Toast.LENGTH_SHORT).show()
}
}
}
我想将其更新为显示 tooltip 消息:
TooltipCompat.setTooltipText(button, item.title)
但是当我长按按钮时,出现以下错误:
10-06 16:32:35.470 22492-22492/com.example.app.ui E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app.ui, PID: 22492
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@e214c8e is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:765)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
at com.android.internal.view.TooltipPopup.show(TooltipPopup.java:74)
at android.view.View.showTooltip(View.java:26365)
at android.view.View.showLongClickTooltip(View.java:26389)
at android.view.View.performLongClickInternal(View.java:6344)
at android.view.View.performLongClick(View.java:6294)
at android.view.View.performLongClick(View.java:6312)
at android.view.View$CheckForLongPress.run(View.java:24662)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我找到了 similar questions 的一些答案,这些答案似乎都表明 View
所属的 Activity
在尝试添加新的 Window
。但是 Activity
在我长按按钮之前肯定是 运行ning,并且没有调用破坏性的生命周期方法(即 onPause
、onStop
、onDestroy
).
是什么导致了这个错误?会不会与 ListView
显示在 PopupWindow
中有关?如果是这样,我该如何补救?
我将必要的代码添加到 GitHub project。如果您 运行 应用程序,您会注意到工具提示在菜单按钮(溢出按钮)上工作正常。但是当您打开菜单并长按任何图标时,应用程序会崩溃并出现上述错误。
你看过这个bug report吗?这看起来像您的问题,但不清楚更改是否已发布。我对你的问题的猜测是工具提示弹出窗口附加到错误的 window.
我创建了一个显示按钮列表的 PopupWindow
。最初,对于我列表中的每个项目,我实现了一个 OnLongClickListener
以在视图持有者中显示一条 Toast
消息:
private inner class MenuItemViewHolder (itemView: View) {
val button: ImageButton = itemView.findViewById(R.id.button);
fun bindItem(item: MenuItem) {
button.setImageDrawable(item.icon)
button.isEnabled = item.isEnabled
button.setOnClickListener { popupWindow.onItemClick(item) }
button.setOnLongClickListener {
Toast.makeText(context, item.title, Toast.LENGTH_SHORT).show()
}
}
}
我想将其更新为显示 tooltip 消息:
TooltipCompat.setTooltipText(button, item.title)
但是当我长按按钮时,出现以下错误:
10-06 16:32:35.470 22492-22492/com.example.app.ui E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app.ui, PID: 22492
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@e214c8e is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:765)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
at com.android.internal.view.TooltipPopup.show(TooltipPopup.java:74)
at android.view.View.showTooltip(View.java:26365)
at android.view.View.showLongClickTooltip(View.java:26389)
at android.view.View.performLongClickInternal(View.java:6344)
at android.view.View.performLongClick(View.java:6294)
at android.view.View.performLongClick(View.java:6312)
at android.view.View$CheckForLongPress.run(View.java:24662)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我找到了 similar questions 的一些答案,这些答案似乎都表明 View
所属的 Activity
在尝试添加新的 Window
。但是 Activity
在我长按按钮之前肯定是 运行ning,并且没有调用破坏性的生命周期方法(即 onPause
、onStop
、onDestroy
).
是什么导致了这个错误?会不会与 ListView
显示在 PopupWindow
中有关?如果是这样,我该如何补救?
我将必要的代码添加到 GitHub project。如果您 运行 应用程序,您会注意到工具提示在菜单按钮(溢出按钮)上工作正常。但是当您打开菜单并长按任何图标时,应用程序会崩溃并出现上述错误。
你看过这个bug report吗?这看起来像您的问题,但不清楚更改是否已发布。我对你的问题的猜测是工具提示弹出窗口附加到错误的 window.