记ViewStub的一个问题
莫名其妙线上报错,一个空指针。如下:
if (rlMain == null) {
View inflate = vsDialog.inflate();
imgClose = inflate.findViewById(R.id.img_close);
rlMain = inflate.findViewById(R.id.rl_main);
}
rlMain.setVisibility(View.VISIBLE);
报错rlMain.setVisibility(View.VISIBLE);
其中rlMain
为空对象。
这件很奇怪了,前面我已经初始化了,而且已经寻找id了。为啥还能为报空了。
但是机型只在5.1 5.0.2 报错,其他都是正常的。
再看vsDialog
创建地方:
//动态添加,避免反射
vsDialog = new ViewStub(ctx);
RelativeLayout.LayoutParams layoutParam2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, res.getDisplayMetrics())));
vsDialog.setId(R.id.vs_main);
vsDialog.setLayoutResource(R.layout.viewstub_home_dailog);
// vsDialog.setInflatedId(R.id.rl_main);
vsDialog.setLayoutParams(layoutParam2);
relativeLayout0.addView(vsDialog);
上面多了vsDialog.setInflatedId(R.id.rl_main);
这一行就不报错了。
所以setInflatedId
这个方法必须要设置,必须设置懒加载文件的id。
看了下源码,没啥区别。可能存在id被覆盖的问题。
先记一下,一定要设置setInflatedId