代码之家  ›  专栏  ›  技术社区  ›  Bryan

TooltipCompat导致BadTokenException

  •  3
  • Bryan  · 技术社区  · 8 年前

    我创建了一个 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 . 但是 活动 在我长按按钮之前肯定正在运行,并且没有调用破坏性的生命周期方法(即。 onPause , onStop , onDestroy ).

    是什么导致了这个错误?这可能与 ListView 弹窗 ? 如果是这样,我该如何补救这种情况?


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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Cheticamp    8 年前

    你看到这个了吗 bug report ? 这看起来像是您的问题,但尚不清楚更改是否已发布。我猜想你的问题是,工具提示弹出窗口连接到了错误的窗口。