有的时候我们需要在页面加载完毕后去 弹出一个对话框(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异常!