我遇到的问题的场景是这样的,recycleview加载图片,然后给recycleview添加一个头部视图,但是运用的过程中发现在xml中并不能很好地控制头部视图的高度,然后准备在代码中动态设置它的宽高,但是问题出现了,不知道什么情况,代码却一直报空指针。

这是代码

RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) mHeaderView.getLayoutParams();

params.height=100;

mHeaderView.setLayoutParams(params);

这是错误异常

刚开始觉得可能是导入的jar包不对不对,然后又切换为引用ViewGroup下的LayoutParams,发现依然没有什么卵用。

后来去网了搜了一下问题的原因,也没有搜出个所以然,很是头疼,不过却无意间看到了有关动态修改高度的另一种写法,就改成了这种的。

RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.MATCH_PARENT, 100);
mHeaderView.setLayoutParams(params);

然后又运行了一遍,发现app能运行了!很是意外,但是我们的目的并不是让代码能运行就可以了,还要搞清楚问题的原因,不然下次遇到还是会犯错!

后来我又分析了一下,既然

params.height= DensityUtil.dip2px(PostActivity.this, 200);

这一行报空指针,肯定是getLayoutParams()得到的对象为空,但是这里怎么可能会为空呢,这里只是简单地get一下params,所以不可能是问题产生的地方,xml也没有任何问题,那出现问题的地方地方只有布局填充的时候了。

然后我再检查代码的时候发现了这么一个字段

headView = LayoutInflater.from(this).inflate(R.layout.post_head_view, null);

第一个是xml文件资源,可是第二个参数null是个什么鬼!然后就去api查了下这个参数的介绍,说这个参数是root参数,也就是父母局,如果这个参数为null,那么在 getLayoutParams()的时候就报空指针的错误,如果不为空填充布局就返回这个root。那么这个地方,这个root参数到底该怎么写呢,这是问题的重点。

后来又研究了一下,根据个人理解,一般一个view是继承view的时候这个字段才会填写,将null改成它的父布局,但是这里并不是继承的view,所以这个参数也根本用不到,既然为空就有解决的办法,后来看了下源码,有这么一段说法

/** * Measure a particular list child.

* TODO: unify with setUpChild.

* @param child The child.

*/ private void measureItem(View child) {

ViewGroup.LayoutParams p = child.getLayoutParams();

**if (p == null) {

p = new ViewGroup.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

}**

.............. }

既然这样这里就有办法解决了。可以这样在getlayoutParams()的时候在上一个判断。

//这里是headview防止为空加的处理
if (mHeaderView.getLayoutParams() == null) {mHeaderView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
ViewGroup.LayoutParams params=mHeaderView.getLayoutParams();
params.height= DensityUtil.dip2px(PostActivity.this, 200);
mHeaderView.setLayoutParams(params);

这样问题就解决了!这里做一下分享,希望能帮到大家。

动态设置view的宽高空指针问题相关推荐

  1. 动态设置View的宽高、宽高比例(设置ViewPager的高度,宽高比例为2:1)

    利用ViewPager显示banner的时候,一些人会直接写死ViewPager高度,比如在xml布局里面直接写成180dp. 这样的话,每个手机的宽度不同,viewpager里面内容的长宽比就不同, ...

  2. 动态设置view或布局的宽高

    代码中动态设置view或布局的宽高   标签: 图片/ 动态改变/ 宽高 有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: ...

  3. js动态设置元素的宽高

    js动态设置元素的宽高 实现代码: var html = document.getElementsByTagName('html')[0];var dl_second_nav=document.get ...

  4. 为什么有时动态设置 View 的背景颜色 BackgroundColor 无效?

    项目场景: 为什么有时动态设置 View 的背景颜色 BackgroundColor 无效,不少新手是不是遇到过这个问题呢 问题描述: 前几天朋友问了我一个问题,他直接在activity里动态设置 V ...

  5. 【Android】动态设置 View 的背景颜色 BackgroundColor 无效的问题

    问题描述 我们都知道 setBackgroundColor() 方法用于动态设置 view 的背景颜色.今天在做需求的时候,需要根据情况动态更新自定义 view 的背景颜色,于是就想当然的这么写: m ...

  6. Android——动态设置view背景颜色setBackgroundColor

    setBackgroundColor 用于动态设置view背景颜色 今天写代码的时候遇到个小问题 动态设置的时候用Color.GRAY,系统自己带着的颜色,是没有问题的 但是用自己定义的颜色,就不生效 ...

  7. 代码中动态设置view或布局的宽高

    有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: 网上有一些教程使用relativeView.setLayoutParam ...

  8. android 动态设置View的高度和宽度,ViewTreeObserver使用

    private int mMonitorHeight = 0; private int mMonitorWidth = 0; private boolean bisSetScreen = false; ...

  9. Android动态设置控件宽高和padding

    在开发过程中我们经常需要动态设置控件的宽高和padding.以TextView为例.如下: 布局代码 TextView的默认宽高为包裹文字,添加了一个背景颜色设置参数后更直观看到效果 <?xml ...

最新文章

  1. Linux设备驱动开发-linux驱动中的阻塞访问方式
  2. 测试:abstract class不允许出现在Angular依赖注入框架的providers区域内
  3. c# datetime._C#| DateTime.Month属性与示例
  4. 跟着编程之美学算法——最长递增子序列(转)
  5. 降低关系型数据库的逻辑复杂
  6. Python代码转换为exe可执行程序详解
  7. Delphi10.4.1开发Linux应用视频重播
  8. windows cmd 复制文件
  9. 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
  10. DAS、NAS、SAN三种高端存储技术分析
  11. linux的木马检测
  12. 高德地图API开发应用-----地图显示+定位+marker
  13. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
  14. LeCun、Bengio等人联名发布:迈向下一代人工智能!催化NeuroAI革命!AI 迎来具身图灵测试大挑战...
  15. 谷歌开源漏洞跟踪工具 Monorail 存在跨站点搜索漏洞
  16. 男人,你连剃须刀都不知道怎么选,活该你单身!
  17. 读里尔克的后感 文/奥斯·科特林
  18. 《会计学》账户与复式记账笔记的思维导图
  19. [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ServletTest_war]]
  20. windows安全警报怎么关闭_windows安全中心怎么关闭

热门文章

  1. 下载量已超越千万的爆红游戏2048(同名小3传奇、1024)源代码解密和下载(第一篇)
  2. 【Gazebo/ROS】阿克曼小车仿真环境设置中的心得体会
  3. android汽车手机互联网,通用汽车部署Android Auto:苹果很无奈
  4. vim配置文件.vimrc
  5. Oracle安装报错 [ INS-32010 ] 主目录位置包含无效字符
  6. mysql基本命令4
  7. uni-app px rpx 互相转换
  8. 解决aspose在linux上中文乱码的方法
  9. Sql性能优化看这一篇就够了
  10. odps之sql性能优化