3

我正在尝试创建显示有关它的一些信息的自定义视图:名称、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>

Contact 只是一个包含字段、getter 和 setter 的类。

一切似乎都很好,但是当我将此视图放在我的 main.xml 并按 Ctrl+S 时,错误正在发生。

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

里面有什么问题?为什么正好在第 39 行?

感谢关注。

4

1 回答 1

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方法的返回布局。

于 2012-04-24T07:13:46.457 回答