自定义ConstraintLayout类的无法调用方法?

时间:2018-10-05 00:32:04

标签: java android-layout

我想创建一个自定义的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();

那么我在做什么错了?我查了一下,这就是获取布局实例的正确方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

问题出在您的LavadasView的构造函数上。当Activity膨胀时,它将在您的自定义布局上调用LavadasView(Context context, AttributeSet attrs)构造函数。在此构造函数中,您需要调用super(context, attrs)来使ConstraintLayout正确膨胀,但是您只调用super(context),这就是为什么获得NullPointerException的原因。