结论:在自定义ViewGroup的onMeasure方法,给调用子View的measure方法时没有传入正确的测量规格
自定义了一个网格布局的RadioGroup 在onMeasure方法中无视子View声明的宽度,用MeasureSpec.EXACTLY+RadioGroup被平分后的宽度来测量子View
](https://i-blog.csdnimg.cn/blog_migrate/9b0fa988f5b87c58a8941f6cfe65c75c.png)
根据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);
博客讲述了在自定义Android ViewGroup时遇到的问题,即在Java中使用不当的MeasureSpec导致子View的gravity失效。作者发现用Java手动设置MeasureSpec的方式在Java代码中不正确,而Kotlin代码表现正常。解决方案是使用Android提供的makeMeasureSpec方法来正确设置测量规格。
2948

被折叠的 条评论
为什么被折叠?



