动态设置view的宽高空指针问题

   我遇到的问题的场景是这样的,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);

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值