2017-10-09 104 views
3

我创建了一个显示按钮列表的PopupWindow。原来,在我的列表中的每个项目,我实现了一个OnLongClickListener,以在视图中显示持有人Toast消息:TooltipCompat造成BadTokenException

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 [email protected] 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) 

我找到了一些答案similarquestions,这似乎都表明ActivityView属于它们在尝试添加新的Window时处于不正确的状态。但在我长按按钮之前,Activity肯定正在运行,并且没有调用破坏性生命周期方法(即,onStop,onDestroy)。

什么可能导致此错误?这可能与ListView显示在PopupWindow这个事实有关吗?如果是这样,我该如何纠正这种情况?


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

+0

你可以在github上发布一个简单的项目吗? – azizbekian

+0

@azizbekian更新了链接。 – Bryan

+1

你见过这个[bug报告](https://issuetracker.google.com/issues/64461213)吗?这看起来像你的问题,但不清楚这些更改是否已经发布。我对你的问题的猜测是工具提示弹出窗口被连接到错误的窗口。 – Cheticamp

回答

1

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

相关问题