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异常!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值