致命异常:主要在 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");