android.view.WindowManager$BadTokenException解决方案

有的时候我们需要在页面加载完毕后去 弹出一个对话框(Popwindows AlertDialog等)
或者我们需要在页面加载完毕后去测绘控件的高度

那么,如果我们在 
 

onCreate方法里直接去操作获取,肯定会出现问题,
比如:

我们通过Handler.sendEmptyMessageDelayed(0, 1000); 就会出现某些机型出现未创建完毕的情况

android.view.WindowManager$BadTokenException


或者获取到的高度为0的情况存在


解决方案为:
第一种:

Textview tvLogin = findViewById(R.id.tvLogin);
tvLogin.post(new Runnable() {
    @Override
    public void run() {
        // do things
    }
});

第二种:
   通过onWindowFocusChanged方法来判断界面是否已经渲染完毕
   返回值 一个布尔类型的值,true 表示界面已经渲染完毕,Activity已经拿到焦点,false表示还在加载中,这个时候是不能弹窗的

  override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            if (!isShow) {

                    //自动打开弹窗
                    isShow = true
                    showPopwindows()
            }
        }
    }


其中:
hasFocus ,判断Activity是否获取焦点,只有获取焦点了才能去处理后面的逻辑。
isShow ,这个变量是在界面一开始就声明好的,默认值是false, 在正常的流程里,点击事件弹出弹窗的时候置为true

就是为了防止在Activity渲染完成后,一直走onWindowFocusChanged方法从而导致popwindow关闭后依旧走此逻辑 重复弹出的问题。

正确处理流程之后,再把 isShowIng 置为true.

至此,一个预加载弹窗就搞定了。


这样就可以很好的避免 界面为加载渲染完毕 提前去创建视图 造成的WindowManager$BadTokenException异常!


版权声明:本文为weixin_40611659原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。