Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android束在活动之间传递时被破坏了?

Android束在活动之间传递时被破坏了?
EN

Stack Overflow用户
提问于 2012-10-30 03:39:37
回答 1查看 1.4K关注 0票数 3

我试图在两个活动之间传递一个Parcelable对象的ArrayList加上一个字符串值。这是将数据添加到意图中并传递给它的代码:

代码语言:javascript
运行
AI代码解释
复制
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);

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

代码语言:javascript
运行
AI代码解释
复制
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直接添加到意图中,都会发生此问题。这是运行在三星的Tab 2运行4.0.3。这在4.0模拟器中也会出现。

编辑这是正在使用的Parcelable对象(我刚刚把getter和setter方法放在了底部)

代码语言:javascript
运行
AI代码解释
复制
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];
     }
 };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-30 14:56:21

好的,对于任何回到这个问题的人来说,我发现了两个问题,我认为这两个问题共同导致了这种行为。这些问题都与我所使用的Parcelable对象有关,所以感谢托德至少指出了我这个方向。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13138207

复制
相关文章

相似问题

在Android活动之间传递protobuf

10

在Android活动之间传递消息?

21

Android:在活动之间传递数据

613

Android在活动之间传递对象

10

Android -在活动之间传递对象

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文