ViewStub不显示问题

428 阅读2分钟

发生场景

在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,以前用过了

后面很久没用了忘记了

这次又重新经历了一遍

我是谁

我在哪

你在干嘛