您的位置:首页 > 编程语言 > PHP开发

setPadding()无效的原因分析

2016-05-17 13:31 351 查看
在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。理解了这个,最初被我淘汰的一种方案好像又死灰复燃了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: