我想创建一个自定义的ConstraintLayout,以便可以从其初始化的活动中触发一些功能。
我有以下代码:
首先在布局中初始化我的自定义视图:
<package.com.app.Main.LavadasView
android:id="@+id/main_autolavados_lavadas_lavadas_view"
android:layout_width="0dp"
android:layout_height="25dp"
...
/>
这是我的自定义类LavadasView,约束布局是从另一个XML文件初始化的:
Java类
public class LavadasView extends ConstraintLayout {
public LavadasView(Context context,AttributeSet attrs) {
super(context);
//Inflate view from XML layout file
LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.lavadas_view, this);
}
public void resetView(){
//Some ui updates
}
}
LavadasView xml文件,只是常规约束布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.constraint.ConstraintLayout>
在我的Activity中,我得到一个带有findViewById
实例的实例,然后我想调用resetView函数,这给了我一个与LavadasView相关的空指针异常:
LavadasView lavadasView = (LavadasView) findViewById(R.id.main_autolavados_lavadas_lavadas_view);
//Call this method later on
lavadasView.resetView();
那么我在做什么错了?我查了一下,这就是获取布局实例的正确方法吗?
谢谢。
答案 0 :(得分:0)
问题出在您的LavadasView
的构造函数上。当Activity
膨胀时,它将在您的自定义布局上调用LavadasView(Context context, AttributeSet attrs)
构造函数。在此构造函数中,您需要调用super(context, attrs)
来使ConstraintLayout
正确膨胀,但是您只调用super(context)
,这就是为什么获得NullPointerException
的原因。>