结论:在自定义ViewGroup的onMeasure方法,给调用子View的measure方法时没有传入正确的测量规格
自定义了一个网格布局的RadioGroup 在onMeasure方法中无视子View声明的宽度,用MeasureSpec.EXACTLY+RadioGroup被平分后的宽度来测量子View
根据View的代码,测量模式是由Width与Height的高两位决定的,代码中的MODE_SHIFT为30位。
所以自己手动设置宽为
//Java
int exactly = 1<<30 +childWidth;
//Kotlin
var exactly = (1 shl 30) + childWidth
最开始自己是用Kotlin写的,测试下来一切正常,符合预期。
但是用java代码这么写,运行时发现,子View的宽度没有问题,但是xml中给子View设置的gravity="center"并没有生效,子View中的文字全部变成左对齐了(在Ktolin中居中是有效的)。通过调试发现是exactly的问题。不知道为什么,在java中不能这么写,好在Android提供了makeMeasureSpec方法,并不需要我们手动生成模式+数值
int exactly = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);