BadTokenException ,popuwindow不是在activcity显示时的崩溃

需求:popuwindow弹窗大家都不陌生
1:pop创建流程

  View view = LayoutInflater.from(this).inflate(R.layout.ticket_popup, null);
            WindowManager manger = (WindowManager) getSystemService(CatagaryActivity.WINDOW_SERVICE);
            @SuppressWarnings("deprecation")
            int width = manger.getDefaultDisplay().getWidth()/4;
            int heigh = manger.getDefaultDisplay().getHeight();
            PopupWindow   mWindow = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, true);           mWindow.setBackgroundDrawable(getResources().getDrawable(android.R.color.transparent));
            mWindow.setOutsideTouchable(true);
            mWindow.setTouchable(true);
            mWindow.setFocusable(true);
            mWindow.update();
       View parent = LayoutInflater.from(this).inflate(R.layout.activity_book_details, null);
            //为popWindow添加动画效果
            mWindow.setAnimationStyle(R.style.dialogWindowAnim);
            // 点击弹出泡泡窗口
            mWindow.showAtLocation(parent, Gravity.BOTTOM, 0,0);
            //popupWindow在弹窗的时候背景半透明
            final WindowManager.LayoutParams params = getWindow().getAttributes();
            params.alpha = 0.5f;
            getWindow().setAttributes(params);
            mWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    params.alpha = 1.0f;
                    getWindow().setAttributes(params);
                }
            });
        }

2:当然这些都是在activity上弹窗出现的效果,要是需要写到adapte或fragmentr的话会出现这个崩溃现象

 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

错误在PopupWindow.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM,0,0); popwindow必须依附于某一个view,而在oncreate中view还没有加载完毕,必须要等activity的生命周期函数全部执行完毕,你需要依附的view加载好后才可以执行popwindow。
查找后给出好多解决方法,有发消息开子线程的,有这样修改的
BadTokenException ,popuwindow不是在activcity显示时的崩溃_第1张图片

所以 PopupWindow必须在某个事件中显示或者是开启一个新线程去调用,不能直接在onCreate方法中显示一个Popupwindow,否则永远会有以上的错误。但是我这样实现了,崩溃信息还是存在的

终极解决方案:
找到控件依附的布局,给他声明一个id,下面这个是依附的父布局
这里写图片描述
BadTokenException ,popuwindow不是在activcity显示时的崩溃_第2张图片

找到这个父控件id,构造方法传递从adapter传递到adapter,如下:
这里写图片描述
这里写图片描述
到这之后就到了重点了,直接写上这句话就解决了这个异常
这里写图片描述
总结:好了完美解决:

你可能感兴趣的:(个人心得,BadToken,adapter弹窗,弹窗崩溃,依附父布局)