一、问题现象
最近在开发过程中遇到了在代码中setvisibility失效的问题,在网上查了好多资料都没有解决我的问题
二、发生背景
项目是MVVM架构,使用了databinding,想在tablayout+viewpager+fragment基础上,控制fragment中RecyclerView中的item里的一个ImageView隐藏与显示。控件通过databinding来setvisibility,但是无效。
三、通用解决方案(对此问题无效)
大部分原因是以下两点
1.控件本身正在执行动画。
2.设备的性能太差,需要重新加载才能显示正常,即需要被回收和重新构造。
问题1可以在控件调用隐藏之前,调用view.clearAnimation();
问题2可以尝试的使用view.invalidate()或者view.postinvalidate();
如果也不行,直接调用自身的requestLayout或者其父容器的requestLayout()进行强制的界面即时刷新重构;
四、最终解
前提条件是确保你的setvisibility()一定执行了~
根据背景提到的,我的项目用到了databinding,那么我在fragment中实例化一个binding对象,通过以下方式
binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.fragment_manual_scene, null, false);
一般情况下通过binding.Imageview.setvisibility()是没有问题的,但是在此项目中就是无法生效。
后来经过一番调试我发现将上述实例化binding的代码换成如下
binding = DataBindingUtil.bind(rootView.findViewById(R.id.auto_scene_cl));
此处的id是父布局的id,
经过这次的更改以后。setvisibility()失效的问题就解决了。
至于此处更改生效的原因及两种实例化方式的区别,有待进一步学习~