usar tutorial studio que describecontents como android android-intent nullpointerexception bundle parcelable

tutorial - como usar parcelable en android



Objeto parcelable que recibe datos pasados ​​que vienen nulos (1)

Estoy trabajando en una aplicación de Android que almacena información de contacto, estoy tratando de agregar una función que al hacer clic en un elemento de contacto en el ListView enviará el objeto de contacto que implemente parcelable sobre dos la segunda actividad.

Aquí es donde envío el objeto de contacto a la Actividad de contactos. `

@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(); }`

Esto está en la clase de actividad onCreate of Contacts, esto verificará si se pasó algún dato usando la etiqueta RECIVED_CONTACT. La línea donde tengo un objeto de tipo Parcelable es donde tengo los errores, obtengo una excepción de puntero nulo.

if (getIntent().getParcelableExtra(ContactsActivity.RECIVED_CONTACT) != null) { //This line is where the exception ouccurs Parcelable receivedContact = getIntent().getParcelableExtra("contact"); updateContact(receivedContact); }

Mi objeto de contacto se ve así

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

No he podido averiguar cómo solucionar esto, así que si quieres ver más de mi código, solo tienes que preguntar y lo publicaré. No sé mucho sobre objetos Parcelable y creo que es por eso que he luchado para hacer esto.

Sin embargo, al hacer clic en un botón Agregar en MainActivity pude iniciar una segunda actividad de contactos con algunos campos EditText para agregar nombres y apellidos, correo electrónico y teléfono. Luego coloque cada una de estas cuatro cadenas en un objeto de contacto y lo envío de nuevo a la actividad principal que se mostrará. No he publicado nada de ese código aquí porque ese código está funcionando. No puedo averiguar cómo actualizar uno de los objetos de contacto que ya están en ListView.

Quiero poder tomar el objeto de contacto que se selecciona de ListView enviarlo a la ContactsActivity y poner cada una de las cuatro cadenas de datos en EditText Fields.


De acuerdo, entonces cuando estás haciendo esto:

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

Terminas con una estructura de datos algo así como:

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

y cuando lo recuperas:

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

No estás mirando lo suficiente. Está buscando en el Intent.getExtras() un campo llamado "contacto", pero en realidad primero necesita recuperar el paquete que lo incluye:

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

Alternativamente, simplemente ponga el contacto directamente en los extras de Intent:

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

y recuperar con:

Contact contact = getIntent().getParcelableExtra(ContactsActivity.RECEIVED_CONTACT);