2012-04-24 9 views
3

私はそれについていくつかの情報を表示するカスタムビューを作成しようとしています:名前、IDなどAndroid - ビューの編集モードでのインスタンス化に失敗しました。 NullPointerExceptionが

をここでは、コード

私の図です。

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行目ではっきり言って?

ありがとうございました。

答えて

4

あなたは膨張したレイアウトにfindViewByIdを呼び出す必要があります。そうしないと、nullが返さ取得

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(); 

inflateメソッドの返されたレイアウトを割り当てていないことに注意してください。

+0

ありがとうございました。今それは動作します! – UnknownJoe

関連する問題