2012-10-30 25 views
3

我想传递一个ArrayList的Parcelable对象加上两个活动之间的字符串值。这是将数据添加到意图,并使其通过代码:在活动之间传递时Android Bundle是否损坏?

Intent intent = new Intent(this, DisplayLotListActivity.class); 
Bundle dataBundle = new Bundle(); 
dataBundle.putParcelableArrayList(DisplayLotListActivity.EXTRA_LOT_ARRAY, lotList); 
dataBundle.putString(EXTRA_LOT_NUMBER, lotNumber); 
intent.putExtra(DisplayLotListActivity.EXTRA_DATA, dataBundle); 
startActivity(intent); 

这是我使用来获取数据了目标活动的意图代码:

Intent intent = getIntent(); 
Bundle dataBundle = intent.getBundleExtra(EXTRA_DATA); 
lotList = dataBundle.getParcelableArrayList(EXTRA_LOT_ARRAY); 
lotNumber = dataBundle.getString(LotInquiryActivity.EXTRA_LOT_NUMBER); 

当我检查调试器时,数据结构在调用活动之前看起来正确,但是当我进入目标活动时,数据结构已损坏。具体来说ArrayList是3个元素,它仍然是3个元素,但第二个元素为null。然后在包中包含一个额外的额外元素,其中包含具有空键的缺少元素对象。我之前和之后都有调试器的图像,但由于反垃圾邮件规则,无法将它们放入帖子中。

前:http://i.stack.imgur.com/vDipq.png 后:http://i.stack.imgur.com/JqbF7.png

有我丢失的东西?无论是使用Bundle还是将ArrayList直接添加到意图中,都会发生此问题。这是在运行4.0.3的Samsung Tab 2上运行的。这也发生在4.0仿真器上。

[编辑] 这是正在使用的Parcelable对象(我刚刚离开了getter和setter方法,断底)

public class Lot implements Parcelable{ 

private String lotn; 

private String dsc1; 
private String dsc2; 
private String litm; 
private long itm; 
private String locn; 
private String mcu; 
private String uom1; 
private String uom2; 
private BigDecimal pqav; 
private BigDecimal pqoh; 
private BigDecimal sqoh; 
private long vend; 
private String rlot; 
private String ldsc; 
private String lots; 
private String lot1; 
private String lot2; 
private String lot3; 
private String lotsdsc; 
private XMLGregorianCalendar mmej; 
private XMLGregorianCalendar ohdj; 

public Lot(){ 

} 

public Lot(Parcel source){ 
    lotn = source.readString(); 
    dsc1 = source.readString(); 
    dsc2 = source.readString(); 
    litm = source.readString(); 
    locn = source.readString(); 
    mcu = source.readString(); 
    uom1 = source.readString(); 
    uom2 = source.readString(); 
    itm = source.readLong(); 
    pqav = new BigDecimal(source.readString()); 
    pqoh = new BigDecimal(source.readString()); 
    sqoh = new BigDecimal(source.readString()); 
    vend = source.readLong(); 
    rlot = source.readString(); 
    ldsc = source.readString(); 
    lots = source.readString(); 
    lot1 = source.readString(); 
    lot2 = source.readString(); 
    lot3 = source.readString(); 
    lotsdsc = source.readString(); 
    try{ 
     mmej = DatatypeFactory.newInstance().newXMLGregorianCalendar(source.readString()); 
    }catch (Exception exc){ 
     mmej = null; 
    } 
    try{ 
     ohdj = DatatypeFactory.newInstance().newXMLGregorianCalendar(source.readString()); 
    }catch (Exception exc){ 
     ohdj = null; 
    } 
} 

public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(lotn); 
    dest.writeString(dsc1); 
    dest.writeString(dsc2); 
    dest.writeString(litm); 
    dest.writeString(locn); 
    dest.writeString(mcu); 
    dest.writeString(uom1); 
    dest.writeString(uom2); 
    dest.writeLong(itm); 
    if(pqav != null){ 
     dest.writeString(pqav.toPlainString()); 
    } else { 
     dest.writeString("0"); 
    } 
    if(pqoh != null){ 
     dest.writeString(pqoh.toPlainString()); 
    } else { 
     dest.writeString("0"); 
    } 
    if(sqoh != null){ 
     dest.writeString(sqoh.toPlainString()); 
    } else { 
     dest.writeString("0"); 
    } 
    dest.writeLong(vend); 
    dest.writeString(rlot); 
    dest.writeString(ldsc); 
    dest.writeString(lots); 
    dest.writeString(lot1); 
    dest.writeString(lot2); 
    dest.writeString(lot3); 
    dest.writeString(lotsdsc); 
    if(mmej != null){ 
     dest.writeString(mmej.toXMLFormat()); 
    } else { 
     dest.writeString(""); 
    } 
    if(ohdj != null){ 
     dest.writeString(ohdj.toXMLFormat()); 
    } else { 
     dest.writeString(""); 
    } 
} 

/** 
* 
*/ 
public static final Parcelable.Creator<Lot> CREATOR 
     = new Parcelable.Creator<Lot>() { 
    public Lot createFromParcel(Parcel in) { 
     return new Lot(in); 
    } 

    public Lot[] newArray(int size) { 
     return new Lot[size]; 
    } 
}; 
+1

如果您为Android API类交换自定义Parcelable类,例如'Rect',是否仍会发生这种情况? –

+0

它看起来不是,我只是用一个Rect尝试了相同的代码,它按预期工作。我的自定义Parcelable对象包含Strings,Longs,BigDecimals和XMLGregorianCalendar对象。我在writeToParcel代码中将最后两种类型表示为字符串。 – Moth

+0

您的问题可能出现在该代码中。你可以发布吗? –

回答

3

OK,对任何人都回来对这个问题有我发现了两个我认为会导致这种行为的问题。这些问题都与我使用的Parcelable对象有关,所以感谢Todd至少指引我朝这个方向发展。

首先,我有一个简单的错误,我错过了我的Parcelable对象的构造函数中的readString()。所以基本上我写出了n个元素,并阅读了n - 1个元素。第二个问题是Android没有实现javax.xml.datatype库,这意味着XMLGregorianCalendar不可用。因为我不需要客户端的这个类的特性(有一个Java Web应用程序可以与之通信),我只是将它转换为一个简单的java.util.Date对象。