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

  

转载于:https://www.cnblogs.com/blog-wenfeng/p/3173448.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值