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()。

  

posted @ 2013-07-05 11:54  wFeng  阅读(1983)  评论(0编辑  收藏  举报