发生场景
在Fragment内部使用ViewStub,
使用情况:
通过fingViewById获取到ViewStub控件
通过判断inflatedId==0,来判断ViewStub是否显示过
首次通过inflate显示ViewStub
之后通过控制visibility来控制显示隐藏
遇到问题:
点击显示ViewStub控件之后,从当前fragment切换到其他fragment,执行了消耗内存和cpu之类的操作回来;或者过一段时间回来;
发现显示的ViewStub没有处于显示状态
解决过程
尝试通过切换按钮触发显示
没有显示成功
通过debug
发现控件的visibility是显示状态
通过切换按钮,发现控件的visibility在进来过程【这里的情况是指在上面操作之后,原来显示的状态,进来的】是显示的状态,但是不显示;切换过程改成了Gone状态,然后又改成了显示状态;还是不行
直接卡住
修改前面控件的获取,每次都是直接findViewById
结果发现,显示之后就返回null了
我用以下代码来查找控件的,发现会崩溃,提示it是null
view.rootView.findViewById<ViewStub>(R.id.xxx)?.let{
it.visibility = GONE
}
上面这个崩溃还是挺意外的
使用了?.let还能让null跑进去,这是什么鬼;兄弟,你没把住门呀
改成了
val v = view.rootView.findViewById<ViewStub>(R.id.xxx)
v?.let{
做你想做的事
}
没有崩溃,这下成功的拦住了
但是null了,怎么关闭啊,我的ViewStub还显示着呢
应该是这里有破绽了
后面看到这篇文章:ViewStub?
原来在inflate的时候,有返回一个View,也就是子布局的最外层布局
v = findViewById.inflate() as ConstraintLayout?
贴个代码,记牢他
通过返回的View来控制后面的显示状态【成功解决问题】
解决结果
其实ViewStub,以前用过了
后面很久没用了忘记了
这次又重新经历了一遍
我是谁
我在哪
你在干嘛