0

Я работаю над Android-приложением, которое хранит контактную информацию. Я пытаюсь добавить функцию, которая при нажатии на элемент контакта в ListView отправит контактный объект который реализует более чем два вторых действия.Parcelable object, который получает переданные данные, заканчивается null

Это место, где я отправляю контактный объект в «Контакты». `

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    final Contact item = (Contact) getListAdapter().getItem(position); 

    Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class); 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("contact", item); 
    updateIntent.putExtra(ContactsActivity.RECIVED_CONTACT, bundle); 
    startActivityForResult(updateIntent,1); 
    adapter.notifyDataSetChanged(); 
}` 

Это в OnCreate из контактов Активность класса, это будет проверять, чтобы увидеть, если какие-либо данные передавались с помощью RECIVED_CONTACT тег. Линия, где у меня есть объект типа Parcelable, где у меня есть ошибки, я получаю исключение с нулевым указателем.

if (getIntent().getParcelableExtra(ContactsActivity.RECIVED_CONTACT) != null) { 

    //This line is where the exception ouccurs 
    Parcelable receivedContact = getIntent().getParcelableExtra("contact"); 
    updateContact(receivedContact); 
} 

Мой Контакт объект выглядит следующим образом

public class Contact implements Parcelable { 

String firstName; 
String lastName; 
String email; 
String phone; 

/** 
* Constructor 
*/ 
public Contact(String firstName, String lastName, String email, String phone) { 
    // TODO Auto-generated constructor stub 
    this(); 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
    this.phone = phone; 
} 

public Contact(Parcel parcel) { 
    this.firstName = parcel.readString(); 
    this.lastName = parcel.readString(); 
    this.email = parcel.readString(); 
    this.phone = parcel.readString(); 
} 

// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods 
    public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() { 
     public Contact createFromParcel(Parcel in) { 
      //return new Contact(in); 
      Contact mContact = new Contact(); 
      mContact.firstName = in.readString(); 
      mContact.lastName = in.readString(); 
      mContact.email = in.readString(); 
      mContact.phone = in.readString(); 
      return mContact; 
     } 

     public Contact[] newArray(int size) { 
      return new Contact[size]; 
     } 

    }; 

    public Contact() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @return the firstName 
    */ 
    public String getFirstName() { 
     return firstName; 
    } 

    /** 
    * @return the lastName 
    */ 
    public String getLastName() { 
     return lastName; 
    } 

    /** 
    * @return the email 
    */ 
    public String getEmail() { 
     return email; 
    } 

    /** 
    * @return the phone 
    */ 
    public String getPhone() { 
     return phone; 
    } 

    public String toString() { 
     return firstName + " \n" + lastName + " \n" 
       + email + " \n" + phone + " \n\n"; 
    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    // write your object's data to the passed-in Parcel 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeString(firstName); 
     out.writeString(lastName); 
     out.writeString(email); 
     out.writeString(phone); 
    } 

} 

я не был в состоянии понять, как это исправить, так что если вы хотите увидеть больше моего кода просто спросив, и я отправлю его , Я мало знаю о Parcelable объектах, и я думаю, именно поэтому я изо всех сил пытался это сделать.

Однако, когда я нажал кнопку добавления в MainActivity, можно было запустить вторую ContactActivity с некоторыми полями EditText для добавления имен и фамилий, электронной почты и телефона. Затем я помещал каждую из этих четырех строк в объект Contact и отправьте его обратно в основной вид деятельности, который будет отображаться. Я не разместил ни одного из этих кодов здесь, потому что этот код работает. Я не могу понять, как обновить один из объектов Contact, уже находящихся в ListView.

Я хочу, чтобы объект контакта, выбранный из ListView, отправил его в ContactActivity и поместил каждую из четырех строк данных в поля editText.

+0

Какая линия вызывает NullPointerException? –

+0

Исправлено: полученоКонтакт = getIntent(). GetParcelableExtra («контакт»); – DonTheAccountant

ответ

2

Итак, когда вы делаете это:

Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class); 
Bundle bundle = new Bundle(); 
bundle.putParcelable("contact", item); 
updateIntent.putExtra(ContactsActivity.RECIVED_CONTACT, bundle); 
startActivityForResult(updateIntent,1); 
adapter.notifyDataSetChanged(); 

Вы в конечном итоге с структуры данных что-то вроде:

Intent { 
    Bundle extras { 
     Bundle bundle { 
      Contact contact; 
     } 
    } 
} 

и когда вы извлекаете его:

Parcelable receivedContact = getIntent().getParcelableExtra("contact"); 

Ты не выглядишь достаточно глубоко. Вы смотрите в Intent.getExtras() пачки для поля с именем «контакт», но на самом деле в первую очередь необходимо, чтобы получить содержащий пакет, который вы поместили его в:

Bundle bundle = getIntent().getBundleExtra(ContactsActivity.RECEIVED_CONTACT); 
Contact contact = bundle.getParcelableExtra("contact"); 

В качестве альтернативы, просто поместите контакт непосредственно в статист Намерения в :

Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class); 
updateIntent.putExtra(ContactsActivity.RECEIVED_CONTACT, item); 

и получить с:

Contact contact = getIntent().getParcelableExtra(ContactsActivity.RECEIVED_CONTACT); 
Смежные вопросы