所有自定义视图实例变量都为null

时间:2015-07-08 00:20:42

标签: android android-layout android-linearlayout

我创建了一个自定义视图,它扩展了LinearLayout并包含两个TextView。即使我在onFinishInflate()中设置了文本视图,但是当我稍后在这些文本视图上调用setText()时,我会得到空指针异常。

以下是自定义视图的代码:

<?xml version="1.0" encoding="utf-8">
<my_package.myapp.MyCustomView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</my_package.myapp.MyCustomView>

my_custom_view.xml如下所示:

View view = new MyCustomView(context); 
((MyCustomView)view).setTitle("Title");   // null pointer exception here
return view;

我稍后使用自定义视图:

public MyCustomView(Context context, SomeObject object){
    this.object = object;
}

// as with the textviews, object would be null here
public int getObjectValue(){
    return object.getValue(); 
}

任何想法我误解或做错了什么?我真的很感激任何帮助。

我还注意到,如果我修改第一个构造函数以获取其他对象,然后尝试使用此对象,则该实例变量也为null。例如:

{{1}}

谢谢!

1 个答案:

答案 0 :(得分:4)

好的,这里有多个问题。

1)你的xml错了。它应该从合并开始,而不是对你的课程的引用,如果你把它膨胀到你的班级。

2)你的所有3名教练都需要做通货膨胀的事情。 (这是它失败的原因 - 这里将调用2或3个参数构造函数。)

3)您不希望或不需要覆盖onFinishInflate。将该代码放在构造函数中。通货膨胀不是异步的,所以没有理由不这样做。