疫情概要
国内疫情
6月4日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例5例,均为境外输入病例(上海4例,四川1例);无新增死亡病例;无新增疑似病例。
国际疫情
截至6月4日,国际上214个国家/地区、日本领海邮轮上和其他商船(不含港澳台地区)累计确诊6332225例新型冠状病毒肺炎病例,累计死亡378222例;6月4日新增129280例确诊病例,新增4842例死亡病例。无新增报告病例的国家和地区。(来源:世界卫生组织)
前言
本篇记录小编在使用ConstrintLayout组件开发过程中遇到的“坑”。
ViewStub高度异常
场景
ViewStub
位于多个子控件之间,宽度设置为 0dp
,高度设置为 44dp
,start和end都为 parent
,即宽为铺满父容器 ConstraintLayout
;而Y轴则指定为其他两个子控件之间,即指定了 layout_constraintTop_toBottomof
和layout_constraintBottom_toTopf
。
但实际运行调用ViewStub.inflate
后的结果是ViewStub
会占满自ViewStub
开始的所有空间,即ViewStub
下方的控件都不会显示。
解决方法
ViewStub
中有这样一个属性:inflatedId,官方文档中的解释如下:
android:inflatedId—Overrides the id of the inflated View with this value
即实际加载的view的ID将会设置为inflatedId
所代表的值。
将该属性的值,与ViewStub的android:id
的值设置的完全一样,即可解决问题。
通过Android Studio自带的Layout Inspector工具查看ViewStub
所在的界面,可以发现ViewStub.inflate
后不会再有ViewStub
标签,只有android:layout
所指向的布局内容,所以使用在ViewStub
上的约束必须通过相同的ID获取到。
ConstraintSet相关
其中对于ConstraintLayout.LayoutParams
有一段特别的说明:
This class contains the different attributes specifying how a view want to be laid out inside a ConstraintLayout
. For building up constraints at run time, using ConstraintSet
is recommended.
翻译过来即:该类包含的属性具体说明了子控件在ConstraintLayout
内的布局位置。ConstraintLayout不推荐在运行时用LayoutParams来设置属性,而是用ConstraintSet来设置参数。
applyTo
场景
ConstraintLayout
的子控件通过View.setVisibility(@Visibility int visibility)
修改过可见性后,调用ConstraintSet.applyTo(ConstraintLayout constraintLayout)
后,子控件的可见性会恢复成初始状态。
解决方法
调用View.setVisibility(@Visibility int visibility)
后再添加ConstraintSet的更新:ConstraintSet.setVisibility(int viewId, int visibility)
其中viewId:调用View.setVisibility()
的id。
分析
1 | /** |
通过上面源码可知:applyTo内部调用了applyToInternal方法,内部又调用了view.setVisibility(constraint.visibility);使用ConstraintSet内保存的值进行刷新。
ConstraintSet主要是对子控件的位置进行控制调整,包括:visibility、alpha、rotation、rotationX、rotationY、scaleX、scaleY、transformPivotX、transformPivotY、translationX、translationY、elevation。
所以不是通过ConstraintSet
更新的这些属性值,在调用applyTo
后都不会生效。