今天在做自定义控件findViewById的时候,发现获取的view为空,而其他系统控件获取不为空。后来发现是因为自定义控件的构造函数写的有问题。
错误写法:
public CMapView(Context context) {
super(context);
init(context);
}
public CMapView(Context context, AttributeSet attrs, int defStyle) {
this(context);
}
public CMapView(Context context, AttributeSet attrs) {
this(context);
}
正确写法:
public CMapView(Context context) {
super(context);
init(context);
}
public CMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public CMapView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
在自定义控件的时候,复写父控件方法,不能不调用super方法,以为layout内部调用需要初始化super方法里面的内容。
注:另外看到有出现同样问题的原因还有,
1.setContentView在findviewbyId之后调用了
2.没有引用正确的父view。e.g.View container = LayoutInflater.from(context).inflate(resource, root); view child = container.findviewbyID(); 一定要加上container
在创建自定义控件时遇到 findViewById() 返回空指针的问题,原因是构造函数未正确调用 super 方法导致。错误示例中,自定义控件的构造函数没有调用 super 方法进行初始化。解决方法是确保每个构造函数都调用对应的 super 方法,并包含 init(context) 初始化操作。此外,还提到了可能导致相同问题的其他原因:setContentView 在 findViewById 之后调用,或者在布局中引用了错误的父视图。

1万+

被折叠的 条评论
为什么被折叠?



