Android 4.3以下, 调用measure(0, 0)抛java.lang.NullPointerException异常

文章分析了在Android 4.3及以下版本,RelativeLayout调用measure(0, 0)方法时抛出java.lang.NullPointerException的问题。异常源于mLayoutParams为null,原因是新实例化的View未添加到父容器。解决方案包括先添加到父容器再测量或在初始化时设置布局参数。" 113368638,10540022,文件系统小记:扇区、块与磁盘I/O优化,"['文件系统', '磁盘管理', '存储优化', 'I/O性能', '块大小']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题

新版本上线后, 后台出现了java.lang.NullPointerException报错,异常发生在RelativeLayout的measure( )方法内部,measure( )方法调用方式如下:

// 实例化一个RelativeLayout对象
mDefaultView = LayoutInflater.from(getContext()).inflate(R.layout.facebook_following_layout, null);
// 调用measure()手动测量长宽,异常就是因为调用measure()
mDefaultView.measure(0, 0);
// 添加父容器中
mParent.addView(mDefaultView);

为何调用measure()会抛异常呢?

2、分析

通过观察发现在Android4.3以下(含4.3)的设备才出现异常,于是查看Android4.3版本的RelativeLayout的代码,出现空指针的地方如下:

/ 就是mLayoutParams为null导致mLayoutParams.width出现异常
f (mLayoutParams.width >= 0) {
     width = Math.max(width, mLayoutParams.width);
}

先不分析为何mLayoutParams会为null,我们看一下Android4.3以上的版本

// 4.3以上因为对mLayoutParams做了判空操作,所以才避免了空指针异常
if (mLayoutParams != null && mLayoutParams.width >= 0) {
     width = Math.max(width, mLayoutParams.width);
}

现在已找到我们上面调用measure( )方法为何4.3以下版本会报错,而4.3以上的版本不会报错的原因。

现在需要分析为何mLayoutParams会为空呢?
mLayoutParams是一个View在父容器中的布局参数,但我们通过mDefaultView = LayoutInflater.from(getContext()).inflate(R.layout.facebook_following_layout, null);
来实例化一个RelativeLayout对象mDefaultView时,mDefaultView还未被添加到父容器中,所以mDefaultView中mLayoutParams还是个空值。

解决方案1:先把View添加父容器后再进行测量

mDefaultView = LayoutInflater.from(getContext()).inflate(R.layout.facebook_following_layout, null);
// 先把mDefaultView先添加到父容器中,这样mLayoutParams就不会为null
mParent.addView(mDefaultView);
// 先添加父容器后再进行测量
mDefaultView.measure(0, 0);

解决方案2:在实例化RelativeLayout对象mDefaultView时,就给mDefaultView对象创建一个mLayoutParams参数

// 在inflate()方法通过设定参数为mDefaultView创建mLayoutParams布局参数
mDefaultView = LayoutInflater.from(getContext()).inflate(R.layout.facebook_following_layout, this, false);
mDefaultView.measure(0, 0);
addView(mDefaultView);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值