TooltipCompat导致BadTokenException

时间:2017-10-09 14:15:48

标签: android tooltip android-support-library

我创建了一个显示按钮列表的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的一些答案,这些答案似乎都表明Activity所属的View在尝试添加时状态不正确一个新的Window。但是,在我按下按钮之前,Activity肯定正在运行,并且没有调用破坏性生命周期方法(即onPauseonStoponDestroy)。< / p>

可能导致此错误的原因是什么?这可能与ListViewPopupWindow显示的事实有关吗?如果是这样,我该如何纠正这种情况呢?

我将必要的代码添加到GitHub project。如果您运行该应用程序,您会注意到工具提示在菜单按钮(溢出按钮)上正常工作。但是当您打开菜单并长按任何图标时,应用程序会因上述错误而崩溃。

1 个答案:

答案 0 :(得分:2)

你见过这个bug report吗?这看起来像您的问题,但不清楚是否已发布更改。我对你的问题的猜测是工具提示弹出窗口被附加到错误的窗口。