动态设置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);
这样问题就解决了!这里做一下分享,希望能帮到大家。
动态设置view的宽高空指针问题相关推荐
- 动态设置View的宽高、宽高比例(设置ViewPager的高度,宽高比例为2:1)
利用ViewPager显示banner的时候,一些人会直接写死ViewPager高度,比如在xml布局里面直接写成180dp. 这样的话,每个手机的宽度不同,viewpager里面内容的长宽比就不同, ...
- 动态设置view或布局的宽高
代码中动态设置view或布局的宽高 标签: 图片/ 动态改变/ 宽高 有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: ...
- js动态设置元素的宽高
js动态设置元素的宽高 实现代码: var html = document.getElementsByTagName('html')[0];var dl_second_nav=document.get ...
- 为什么有时动态设置 View 的背景颜色 BackgroundColor 无效?
项目场景: 为什么有时动态设置 View 的背景颜色 BackgroundColor 无效,不少新手是不是遇到过这个问题呢 问题描述: 前几天朋友问了我一个问题,他直接在activity里动态设置 V ...
- 【Android】动态设置 View 的背景颜色 BackgroundColor 无效的问题
问题描述 我们都知道 setBackgroundColor() 方法用于动态设置 view 的背景颜色.今天在做需求的时候,需要根据情况动态更新自定义 view 的背景颜色,于是就想当然的这么写: m ...
- Android——动态设置view背景颜色setBackgroundColor
setBackgroundColor 用于动态设置view背景颜色 今天写代码的时候遇到个小问题 动态设置的时候用Color.GRAY,系统自己带着的颜色,是没有问题的 但是用自己定义的颜色,就不生效 ...
- 代码中动态设置view或布局的宽高
有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: 网上有一些教程使用relativeView.setLayoutParam ...
- android 动态设置View的高度和宽度,ViewTreeObserver使用
private int mMonitorHeight = 0; private int mMonitorWidth = 0; private boolean bisSetScreen = false; ...
- Android动态设置控件宽高和padding
在开发过程中我们经常需要动态设置控件的宽高和padding.以TextView为例.如下: 布局代码 TextView的默认宽高为包裹文字,添加了一个背景颜色设置参数后更直观看到效果 <?xml ...
最新文章
- Linux设备驱动开发-linux驱动中的阻塞访问方式
- 测试:abstract class不允许出现在Angular依赖注入框架的providers区域内
- c# datetime._C#| DateTime.Month属性与示例
- 跟着编程之美学算法——最长递增子序列(转)
- 降低关系型数据库的逻辑复杂
- Python代码转换为exe可执行程序详解
- Delphi10.4.1开发Linux应用视频重播
- windows cmd 复制文件
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
- DAS、NAS、SAN三种高端存储技术分析
- linux的木马检测
- 高德地图API开发应用-----地图显示+定位+marker
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
- LeCun、Bengio等人联名发布:迈向下一代人工智能!催化NeuroAI革命!AI 迎来具身图灵测试大挑战...
- 谷歌开源漏洞跟踪工具 Monorail 存在跨站点搜索漏洞
- 男人,你连剃须刀都不知道怎么选,活该你单身!
- 读里尔克的后感 文/奥斯·科特林
- 《会计学》账户与复式记账笔记的思维导图
- [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ServletTest_war]]
- windows安全警报怎么关闭_windows安全中心怎么关闭