setPadding()无效的原因分析
2016-05-17 13:31
351 查看
在ListView中经常使用view.setPadding(left, top, right, bottom)来实现下拉和上拉的效果(view代表headerView或footerView),主要设置top值即可。
我现在在写一个自定义控件,里面就用到了这个setPadding( ),view的高度是给定的,结果就直接代码创建了一个View,通过LayouParams设置它的高度值为给定值,效果死活出不来,百度了一圈也没找到答案。
当然有其他办法可以解决,但不知道原因,下次肯定还会碰到,不行,得弄明白。在经历一波又一波的测试与思考中,终于找到了原因。
在其最大高度是我们设定数值的情况下,要使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。理解了这个,最初被我淘汰的一种方案好像又死灰复燃了。
我现在在写一个自定义控件,里面就用到了这个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。理解了这个,最初被我淘汰的一种方案好像又死灰复燃了。
相关文章推荐
- phpstorm10.0.1和webstorm11注册
- laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试
- EditPlus注册码在线生成,强大
- 七牛EVM云主机ftp环境搭建以及注意事项
- 一款不错的PHP在线文件管理系统,PHP WEBFTP
- php 利用远程图片创建新图片完善(jpg,png,gif)
- php 利用远程png图片创建新png图片
- PHP图片合成加水印并生成缩略图
- php写守护进程(Daemon)
- php 利用远程图片创建新图片(jpg,gif,png)
- ThinkPHP中的调试模式
- php getimagesize获取图片信息(.jpg,.gif,.png)
- File 方法中 getParentFile()的用法及作用
- php 利用远程jpg图片创建新jpg图片
- 50个PHP程序性能优化的方法
- phpExcel
- php中对2个数组相加的函数
- php字符串函数
- php数据类型
- php 递归创建及删除目录