Android - 视图无法在编辑模式下实例化。空指针异常

时间:2012-04-24 07:11:10

标签: android nullpointerexception

我正在尝试创建自定义视图,显示有关它的一些信息:名称,ID等

这是代码

我的观点。

public class ContactView extends RelativeLayout {

    private TextView name, id, status, sex;
    private Contact linkedContact;

    public ContactView(Context context) {
        this(context, null);
    }

    public ContactView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ContactView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutInflater.inflate(R.layout.myfirstcustomview, this);
        name = (TextView) findViewById(R.id.contactName);
        id = (TextView) findViewById(R.id.contactId);
        status = (TextView) findViewById(R.id.contactStatus);
        sex = (TextView) findViewById(R.id.contactSex);
        update();
    }

    private void update() {
        if (isInEditMode()) {
            name.setText("Dummy");
            id.setText("Test_ID");
            status.setText("Hello, there!");
            sex.setText("Unknown, dawg");
            return;
        }

        if (linkedContact == null) {
            name.setText("");
            id.setText("");
            status.setText("");
            sex.setText("");
        } else {
            name.setText(linkedContact.getName());
            id.setText(linkedContact.getId());
            status.setText(linkedContact.getStatus());
            String s = linkedContact.getSex() ? "Male" : "Female";
            sex.setText(s);
        }
    }

    public Contact getLinkedContact() {
        return linkedContact;
    }

    public void setLinkedContact(Contact linkedContact) {
        this.linkedContact = linkedContact;
    }

}

myfirstcustomview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/contactName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ellipsize="end"
        android:singleLine="true"
        android:text="" />

    <TextView
        android:id="@+id/contactId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/contactName"
        android:layout_below="@id/contactName"
        android:text="" />

    <TextView
        android:id="@+id/contactStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/contactId"
        android:paddingLeft="20dp"
        android:text="" />

    <TextView
        android:id="@+id/contactSex"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="" />

</RelativeLayout>

联系人只是一个包含字段,getter和setter的类。

一切似乎都很好,但是当我在main.xml中删除此视图并按Ctrl + S时会出现错误。

***.ContactView failed to instantiate.
java.lang.NullPointerException
    at ***.ContactView.update(ContactView.java:39)

那里有什么问题?为什么在第39行呢?

感谢您的关注。

1 个答案:

答案 0 :(得分:4)

您需要在充气布局上调用findViewById

    LayoutInflater layoutInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    RelativeLayout layout = layoutInflater.inflate(R.layout.myfirstcustomview, this);
    name = (TextView) layout.findViewById(R.id.contactName);
    id = (TextView) layout.findViewById(R.id.contactId);
    status = (TextView) layout.findViewById(R.id.contactStatus);
    sex = (TextView) layout.findViewById(R.id.contactSex);
    update();

否则返回null。

请注意,您没有指定inflate方法的返回布局。