Android 接收传递的数据并返回空值的可包裹对象

Android 接收传递的数据并返回空值的可包裹对象,android,android-intent,nullpointerexception,bundle,parcelable,Android,Android Intent,Nullpointerexception,Bundle,Parcelable,我正在开发一个存储联系人信息的Android应用程序,我正在尝试添加一个功能,当您在ListView中单击联系人项目时,它将在第二个活动中发送实现parcelable的联系人对象 这是我将contact对象发送到Contacts活动的地方。 ` 这是在Contacts活动类的onCreate中,它将检查是否传递了任何数据 使用接收的_联系人标签。 我有一个Parcelable类型的对象的那一行就是我有错误的地方,我得到了一个空指针异常 if (getIntent().getParcelableE

我正在开发一个存储联系人信息的Android应用程序,我正在尝试添加一个功能,当您在ListView中单击联系人项目时,它将在第二个活动中发送实现parcelable的联系人对象

这是我将contact对象发送到Contacts活动的地方。 `

这是在Contacts活动类的onCreate中,它将检查是否传递了任何数据 使用接收的_联系人标签。 我有一个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);
    }

}
公共类联系人实现可包裹{
字符串名;
字符串lastName;
字符串电子邮件;
字符串电话;
/**
*建造师
*/
公共联系人(String firstName、String lastName、String email、String phone){
//TODO自动生成的构造函数存根
这个();
this.firstName=firstName;
this.lastName=lastName;
this.email=电子邮件;
this.phone=电话;
}
公众联络(包裹){
this.firstName=parcel.readString();
this.lastName=parcel.readString();
this.email=parcel.readString();
this.phone=packet.readString();
}
//这用于重新生成对象。所有地块都必须有一个实现这两种方法的创建者
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共联系人createFromParcel(包裹中){
//返回新联系人(in);
联系人mContact=新联系人();
mContact.firstName=in.readString();
mContact.lastName=in.readString();
mContact.email=in.readString();
mContact.phone=in.readString();
返回mContact;
}
公共联系人[]新数组(整数大小){
返回新联系人[大小];
}
};
公众联络(){
//TODO自动生成的构造函数存根
}
/**
*@返回名字
*/
公共字符串getFirstName(){
返回名字;
}
/**
*@返回姓氏
*/
公共字符串getLastName(){
返回姓氏;
}
/**
*@返回电子邮件
*/
公共字符串getEmail(){
回复邮件;
}
/**
*@还电话
*/
公共字符串getPhone(){
回电话;
}
公共字符串toString(){
返回firstName+“\n”+lastName+“\n”
+电子邮件+“\n”+电话+“\n\n”;
}
@凌驾
公共int描述内容(){
//TODO自动生成的方法存根
返回0;
}
//将对象的数据写入传入的地块
公共无效写入包(包出,内部标志){
out.writeString(名字);
out.writeString(姓氏);
外写(电子邮件);
外出。写网线(电话);
}
}
我还没有弄明白如何解决这个问题,所以如果你想看到更多我的代码,请询问,我会发布它。我对可包裹的物品了解不多,我想这就是为什么我一直努力这么做的原因

但是,当我在MainActivity中单击add按钮时,我能够启动第二个ContactsActivity,其中包含一些EditText字段,用于添加名字和姓氏、电子邮件和电话,然后我将这四个字符串中的每一个字符串放入Contact对象,并将其发送回要显示的Main activity。我没有在这里发布任何代码,因为这些代码正在工作。我不知道如何更新ListView中已有的联系人对象之一


我希望能够将从ListView中选择的联系人对象发送到ContactsActivity,并将四个数据字符串中的每一个放入editText字段。

好的,因此在执行此操作时:

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中查找名为“contact”的字段,但实际上首先需要检索放入该字段的包含bundle:

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

哪一行导致NullPointerException?Parcelable receivedContact=getIntent().getParcelableExtra(“联系人”);
Contact contact = getIntent().getParcelableExtra(ContactsActivity.RECEIVED_CONTACT);