FrameLayout中常犯的错误
此笔记随时更新,遇到了就写上。
自定义控件,从Framelayout继承引发的诸多血案,键盘鼠标暴毙而亡,各位童鞋还是小心为上。
1. 为啥要从Framelayout开始继承而非ViewGroup?
这当然跟自定义控件的具体要求而选择的。本人比较懒,常常选择Framelayout而非ViewGroup
通过调用super的measure,他可以帮你把当前控件和子控件的measureWidth&measureHeight都算好。
super的layout常常没啥用,毕竟自定义控件,布局需要自己搞。
2. 为啥子控件的宽高都和父类的宽高一样?
因为measureAllChildren=true了。
解决方法,在xml中增加android:measureAllChildren="false"。或者代码调用setMeasureAllChildren(false);
原因:参见FrameLayout#onMeasure(int, int)的源码
android:measureAllChildren="true"时,将所有children加入到mMeasureAllChildren的链表中,然后再重新measure以下。
3.为啥在onLayout中,调用子控件child.layout(l, t, r, b)之后没有效果啊。
虽然你在某个角落里调用了child.layout. 但如果onLayout()中你调用父类的onLayout的话,child归位了是必然的。
所以尽量不要调用父类的onLayout方法。
4.注意padding。
其实这个并不仅仅是Framelayout中才有的问题。很多人自定义控件时并不考虑padding。使用的时候很麻烦。里面有几个很重要的方法
measureChildren(int, int) // 这个会将父类的padding的数值考虑进去,所以你传进去的值不用减去padding。
child.measure(int, int) // 这个你就得减去padding了。
在onLayout中,left和top分别加上padding再child.layout()。