接收传递数据的Parcelable对象为null

时间:2014-11-26 19:22:21

标签: android android-intent nullpointerexception bundle parcelable

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

这是我将联系人对象发送到“联系人”活动的位置。 `

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

这是在Contacts活动类的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中的添加按钮时能够启动第二个ContactsActivity,其中包含一些EditText字段,用于添加名字和姓氏,电子邮件和电话我然后将这四个字符串中的每一个放入Contact对象并发送它返回要显示的主要活动。我没有在这里发布任何代码,因为该代码正在运行。我无法弄清楚如何更新ListView中已有的一个Contact对象。

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

1 个答案:

答案 0 :(得分: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()包中查找名为“contact”的字段,但实际上您首先需要检索包含它的包含的包:

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

或者,只需将联系人直接放入Intent的附加内容:

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

并检索:

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