popWindow踩坑--android.view.WindowManager$BadTokenException: Unable to add window...

本文详细解释了在Android开发过程中遇到的PopupWindow显示失败的问题及其解决方案。问题表现为尝试在Activity尚未完全初始化时显示PopupWindow导致的错误。文章提供了一个实用的方法来避免此问题:将PopupWindow的触发事件放在视图加载完成后的回调方法中。
Unable to add window –token null is not valid; is your activity running
#popwindow遇到上面的错误,原因:PopupWindow.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM,0,0); popwindow必须依附于某一个view,而在oncreate中view还没有加载完毕,必须要等activity的生命周期函数全部执行完毕,你需要依附的view加载好后才可以执行popwindow。
而我把它的showAsDropDown(…)方法的第一个参数填的是main_xml的根布局,这个布局在开始时还没有被完全加载完,所以我认为popwindow的触发事件最好放到回调方法中去:

如: 写一个textview,在它的onClick方法中去触发popWIndow出现。就OK了。

这个bug修复参考于简书:
作者:爱情小傻蛋
链接:https://www.jianshu.com/p/4c5fafe08fa7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然给定的参考引用未涉及Android中`androidx.recyclerview.widget.RecyclerView`下`PopWindow`接收不到点击事件的问题,但常见的解决办法如下: ### 1. 确保 PopupWindow 可聚焦 PopupWindow 默认可能不可聚焦,导致无法接收点击事件。可以通过`setFocusable(true)`方法设置其可聚焦。 ```java PopupWindow popupWindow = new PopupWindow(context); popupWindow.setFocusable(true); ``` ### 2. 确保 PopupWindow 的内容视图可点击 可以为 PopupWindow 的内容视图设置`setClickable(true)`,确保其能够响应点击事件。 ```java View contentView = LayoutInflater.from(context).inflate(R.layout.popup_layout, null); contentView.setClickable(true); PopupWindow popupWindow = new PopupWindow(contentView, width, height); ``` ### 3. 避免 RecyclerView 拦截事件 RecyclerView 可能会拦截 PopupWindow 上的点击事件。可以通过重写 RecyclerView 的`onInterceptTouchEvent`方法,确保不拦截 PopupWindow 的点击事件。 ```java public class CustomRecyclerView extends RecyclerView { public CustomRecyclerView(Context context) { super(context); } public CustomRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public CustomRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { // 在这里判断是否需要拦截事件,如果是 PopupWindow 区域则不拦截 return false; } } ``` ### 4. 确保 PopupWindow 显示在合适的位置 如果 PopupWindow 显示在 RecyclerView 的子项之上,可能会被 RecyclerView 的子项拦截事件。可以调整 PopupWindow显示位置,确保它不会与 RecyclerView 的子项重叠。 ```java popupWindow.showAsDropDown(anchorView); ``` ### 5. 检查 PopupWindow 的背景 如果 PopupWindow 没有设置背景,可能会导致点击事件无法正常响应。可以为 PopupWindow 设置背景。 ```java popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值