setPadding()无效的原因分析

在ListView中经常使用view.setPadding(left, top, right, bottom)来实现下拉和上拉的效果(view代表headerView或footerView),主要设置top值即可。

我现在在写一个自定义控件,里面就用到了这个setPadding( ),view的高度是给定的,结果就直接代码创建了一个View,通过LayouParams设置它的高度值为给定值,效果死活出不来,百度了一圈也没找到答案。

View view = new View(getContext());
AbsListView.LayoutParams viewParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 60);
view .setLayoutParams(viewParams);

// 添加HeaderView
view.setPadding(0, -60, 0, 0);
mListView.addHeaderView(view);

当然有其他办法可以解决,但不知道原因,下次肯定还会碰到,不行,得弄明白。在经历一波又一波的测试与思考中,终于找到了原因。

在其最大高度是我们设定数值的情况下,要使setPadding( )有效果,能动态改变高度,必须满足两个条件:
(1)view必须是ViewGroup子类;
(2)父控件高度必须是包裹内容wrap_content。

后来仔细想想,padding值就是内边距,如果要改变高度,高度的设置肯定是wrap_content。且我们需要的最大高度都是固定的,很多时候都是用布局文件来写,所以里面需要子控件来控制其高度,无论是数值,还是wrap_content,总有能确定其高度的。

下面根据view的控件类型和高度,得出几种情况:

【1】view是一个最终子控件(即不能包含子控件的控件,如TextView、View),高度是数值。如果是TextView,内部的Text文本位置会变,但总高度不变。——无效

【2】view是一个最终子控件,高度是wrap_content。如果是TextView,内部的Text文本位置会变,总高度也会变。但总高度值不确定,需要完整地测量出来后才能获取——视情况选择

【3】view是一个ViewGroup子类,高度是数值。与【1】一样,内部子控件会发生位置变化,但总高度不变。——无效

【4】view是一个ViewGroup子类,高度是wrap_content。内部子控件位置变化,总高度也会变。由子控件来控制总高度,OK。——有效。

给一个效果图,用xml布局文件画出来,不成问题。但真正理解了吗?以上就是没真正理解透造成的初级Bug。理解了这个,最初被我淘汰的一种方案好像又死灰复燃了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值