2015-02-06 44 views
-2

當我試圖將我的對象從一個Activity傳遞到另一個Activity時,存在問題。致命例外:主要在Android意圖

Intent intent = new Intent(this, CreateOrEditContactActivity.class); 
intent.putExtra("contact", currentContact); 
startActivity(intent); 

下面是我的課聯繫的描述:

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照片== 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) 

可能是什麼問題?如何正確傳達我的對象到另一個活動?

+2

可以添加logcat的休息嗎? – Jens 2015-02-06 06:45:01

+0

提供的類和堆棧跟蹤之間的關係是什麼? – 2015-02-06 07:13:51

回答

0

我解決了這個問題。這就是你怎麼可以這樣做:

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

這裏是你的類:

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

} 

和活動之間傳遞數據,如:

Contact contact = new Contact(); 
Intent intent = new Intent(context, NextActivity.class); 
Bundle bundle = new Bundle(); 
bundle.putParcelable("bundleconstant", contact); 
intent.putExtras(bundle); 
startActivity(intent); 
+0

我這樣做了,但都一樣不起作用(我甚至會說它效果更差)。 – Fredisson 2015-02-07 01:38:20

+0

真的!你確實在某些地方做錯了事。只是爲了澄清你是否在通過intent傳遞對象之前設置了像contact.setId(1)等數據。你需要在這裏提供完整的代碼,否則我不能幫助.. – sUndeep 2015-02-07 16:40:02

+0

我發現了一個錯誤 - 無需使用Drawable來存儲圖像,現在我使用位圖。 – Fredisson 2015-02-08 14:00:32