致命异常:主要在 Android 意图中
FATAL EXCEPTION: main in Android intent
当我尝试将对象从一个对象传送到另一个对象时出现问题 Activity。
Intent intent = new Intent(this, CreateOrEditContactActivity.class);
intent.putExtra("contact", currentContact);
startActivity(intent);
下面是我的 class 联系人的描述:
public class Contact implements Parcelable{
private int ID;
private String name;
private String surname;
private String dob;
private String sex;
private String address;
private Drawable photo;
//Other constructors and methods
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeArray(new Object[]{ID, name, surname, dob, sex, address, photo});
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
@Override
public Contact createFromParcel(Parcel source) {
return new Contact(source);
}
@Override
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel parcel) {
Object[] data = parcel.readArray(Contact.class.getClassLoader());
ID = (Integer) data[0];
name = (String) data[1];
surname = (String) data[2];
dob = (String) data[3];
sex = (String) data[4];
address = (String) data[5];
photo = (Drawable) data[6];
}
我还注意到,如果在 currentContact photo == null 中,那么一切正常,如果没有,我会得到一个致命的异常:
02-06 09:28:26.691 21650-21650/com.mycontacts.app D/AndroidRuntime﹕ Shutting down VM
02-06 09:28:26.693 21650-21650/com.mycontacts.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mycontacts.app, PID: 21650
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at android.support.v7.internal.view.SupportMenuInflater$InflatedOnMenuItemClickListener.onMenuItemClick(SupportMenuInflater.java:259)
at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:596)
at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
可能是什么问题?如何正确地将我的对象传达给另一个人activity?
这是你的 class:
package com.healthglow.model;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
public class Contact implements Parcelable {
int ID;
String name;
String surname;
String dob;
String sex;
String address;
Drawable photo;
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Drawable getPhoto() {
return photo;
}
public void setPhoto(Drawable photo) {
this.photo = photo;
}
public Contact() {
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ID);
dest.writeString(name);
dest.writeString(surname);
dest.writeString(dob);
dest.writeString(sex);
Bitmap bitmap = (Bitmap) ((BitmapDrawable) photo).getBitmap();
dest.writeParcelable(bitmap, flags);
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
public Contact createFromParcel(Parcel in) {
return new Contact(in);
}
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel in) {
ID = in.readInt();
name = in.readString();
surname = in.readString();
dob = in.readString();
sex = in.readString();
address = in.readString();
Bitmap bitmap = (Bitmap) in.readParcelable(getClass().getClassLoader());
photo = new BitmapDrawable(bitmap);
}
}
并在 activity 之间传递数据,例如:
Contact contact = new Contact();
Intent intent = new Intent(context, NextActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("bundleconstant", contact );
intent.putExtras(bundle);
startActivity(intent);
我解决了这个问题。这就是你可以做到的:
public class Contact implements Parcelable{
enter code hereprivate int ID;
private String name;
private String surname;
private String dob;
private String sex;
private String address;
private Bitmap photo;
public Contact(Context context) {
ID = -1;
name = surname = dob = sex = address = "";
photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.default_user);
}
public Contact(int ID, String name, String surname, String dob, String sex, String address, Bitmap photo) {
this.ID = ID;
this.name = name;
this.surname = surname;
this.dob = dob;
this.sex = sex;
this.address = address;
this.photo = photo;
}
public Contact(int ID, String name, String surname, Bitmap photo) {
this.ID = ID;
this.name = name;
this.surname = surname;
this.photo = photo;
}
// Here Setters & Getters
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeArray(new Object[]{ID, name, surname, dob, sex, address, photo});
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
@Override
public Contact createFromParcel(Parcel source) {
return new Contact(source);
}
@Override
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel parcel) {
Object[] data = parcel.readArray(Contact.class.getClassLoader());
ID = (Integer) data[0];
name = (String) data[1];
surname = (String) data[2];
dob = (String) data[3];
sex = (String) data[4];
address = (String) data[5];
photo = (Bitmap) data[6];
}
}
所以我发送对象:
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("key", currentContact);
startActivity(intent);
这就是我获取对象的方式:
Contact c = getIntent().getParcelableExtra("key");
当我尝试将对象从一个对象传送到另一个对象时出现问题 Activity。
Intent intent = new Intent(this, CreateOrEditContactActivity.class);
intent.putExtra("contact", currentContact);
startActivity(intent);
下面是我的 class 联系人的描述:
public class Contact implements Parcelable{
private int ID;
private String name;
private String surname;
private String dob;
private String sex;
private String address;
private Drawable photo;
//Other constructors and methods
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeArray(new Object[]{ID, name, surname, dob, sex, address, photo});
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
@Override
public Contact createFromParcel(Parcel source) {
return new Contact(source);
}
@Override
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel parcel) {
Object[] data = parcel.readArray(Contact.class.getClassLoader());
ID = (Integer) data[0];
name = (String) data[1];
surname = (String) data[2];
dob = (String) data[3];
sex = (String) data[4];
address = (String) data[5];
photo = (Drawable) data[6];
}
我还注意到,如果在 currentContact photo == null 中,那么一切正常,如果没有,我会得到一个致命的异常:
02-06 09:28:26.691 21650-21650/com.mycontacts.app D/AndroidRuntime﹕ Shutting down VM
02-06 09:28:26.693 21650-21650/com.mycontacts.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mycontacts.app, PID: 21650
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at android.support.v7.internal.view.SupportMenuInflater$InflatedOnMenuItemClickListener.onMenuItemClick(SupportMenuInflater.java:259)
at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:596)
at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
可能是什么问题?如何正确地将我的对象传达给另一个人activity?
这是你的 class:
package com.healthglow.model;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
public class Contact implements Parcelable {
int ID;
String name;
String surname;
String dob;
String sex;
String address;
Drawable photo;
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Drawable getPhoto() {
return photo;
}
public void setPhoto(Drawable photo) {
this.photo = photo;
}
public Contact() {
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ID);
dest.writeString(name);
dest.writeString(surname);
dest.writeString(dob);
dest.writeString(sex);
Bitmap bitmap = (Bitmap) ((BitmapDrawable) photo).getBitmap();
dest.writeParcelable(bitmap, flags);
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
public Contact createFromParcel(Parcel in) {
return new Contact(in);
}
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel in) {
ID = in.readInt();
name = in.readString();
surname = in.readString();
dob = in.readString();
sex = in.readString();
address = in.readString();
Bitmap bitmap = (Bitmap) in.readParcelable(getClass().getClassLoader());
photo = new BitmapDrawable(bitmap);
}
}
并在 activity 之间传递数据,例如:
Contact contact = new Contact();
Intent intent = new Intent(context, NextActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("bundleconstant", contact );
intent.putExtras(bundle);
startActivity(intent);
我解决了这个问题。这就是你可以做到的:
public class Contact implements Parcelable{
enter code hereprivate int ID;
private String name;
private String surname;
private String dob;
private String sex;
private String address;
private Bitmap photo;
public Contact(Context context) {
ID = -1;
name = surname = dob = sex = address = "";
photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.default_user);
}
public Contact(int ID, String name, String surname, String dob, String sex, String address, Bitmap photo) {
this.ID = ID;
this.name = name;
this.surname = surname;
this.dob = dob;
this.sex = sex;
this.address = address;
this.photo = photo;
}
public Contact(int ID, String name, String surname, Bitmap photo) {
this.ID = ID;
this.name = name;
this.surname = surname;
this.photo = photo;
}
// Here Setters & Getters
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeArray(new Object[]{ID, name, surname, dob, sex, address, photo});
}
public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
@Override
public Contact createFromParcel(Parcel source) {
return new Contact(source);
}
@Override
public Contact[] newArray(int size) {
return new Contact[size];
}
};
private Contact(Parcel parcel) {
Object[] data = parcel.readArray(Contact.class.getClassLoader());
ID = (Integer) data[0];
name = (String) data[1];
surname = (String) data[2];
dob = (String) data[3];
sex = (String) data[4];
address = (String) data[5];
photo = (Bitmap) data[6];
}
}
所以我发送对象:
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("key", currentContact);
startActivity(intent);
这就是我获取对象的方式:
Contact c = getIntent().getParcelableExtra("key");