3

2 つのアクティビティ間で、Parcelable オブジェクトの ArrayList と文字列値を渡そうとしています。これは、インテントにデータを追加して渡すコードです。

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

デバッガーをチェックすると、アクティビティが呼び出される前はデータ構造が正しいように見えますが、ターゲット アクティビティに入るとデータ構造が壊れています。具体的には、3 つの要素としての ArrayList であり、サイズはまだ 3 つの要素ですが、2 番目の要素は null です。バンドルには、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 オブジェクトです (ゲッター メソッドとセッター メソッドは一番下に残しました)

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];
     }
 };
4

1 に答える 1

3

OK、この質問に戻ってくる人のために、私が見つけた 2 つの問題があり、それらが組み合わさってこの動作を引き起こしていると思われます。問題はすべて、私が使用していた Parcelable オブジェクトに関連していたので、少なくともこの方向性を示してくれた Todd に感謝します。

まず、Parcelable オブジェクトのコンストラクターで readString() を見逃していたという単純なエラーが発生しました。したがって、基本的には n 個の要素を書き出し、n - 1 個の要素を読み込んでいました。2 つ目の問題は、Android が javax.xml.datatype ライブラリを実装していないことです。これは、XMLGregorianCalendar が利用できないことを意味します。クライアント側でこのクラスの機能を必要としなかったので (このクラスを使用する Java Web アプリケーションと対話します)、代わりに単純な java.util.Date オブジェクトに変換しました。

于 2012-10-30T22:56:21.913 に答える