我正在开发一个存储联系信息的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字段中。
答案 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);