3

我正在尝试使用 Parcelable 传递自定义对象的数组。我在搜索中发现了一些讨论,例如链接。我遵循了这些示例,但找不到对象数组的实现。我的问题是对象在新活动中变为空。我的实现如下。

我的可感知对象

    public class showStatisticsObj implements Parcelable{
    public String dt = null;
    public int totalmiles = 0;
    public Date date = null;

    public showStatisticsObj() { ; };

    public showStatisticsObj(Parcel in) { readFromParcel(in); } 

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel arg0, int arg1) {
        // TODO Auto-generated method stub
        arg0.writeString(dt); 
        arg0.writeInt(totalmiles);      
    }


    public void readFromParcel(Parcel in) {   
        dt = in.readString(); 
        totalmiles = in.readInt(); 
    } 

    @SuppressWarnings("rawtypes")
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
        public showStatisticsObj createFromParcel(Parcel in) 
        { 
            return new showStatisticsObj(in); 
        }   
        public showStatisticsObj[] newArray(int size) 
        { 
            return new showStatisticsObj[size]; 
        } 
    }; 

    }


    Parcelable[] passedArray = new Parcelable[totaldifferentDates];
    for (int i=0; i<totaldifferentDates; ++i) {
        passedArray[i] = showStatObj[i];
    }

    Intent displayintent = new Intent(this, DisplayStatistics.class);
    displayintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    displayintent.putExtra("bundleObj", passedArray);
    startActivity(displayintent);

在新活动中,我提取为

    Bundle bundle = getIntent().getExtras();    
    showStatObjinDisplay = (showStatisticsObj) bundle.getParcelable("bundleObj");

但 showStatObjinDisplay 为空。怎么了?请帮帮我。

4

2 回答 2

5

我会尝试像 Minhtdh 所说的那样更改 CREATOR。

接下来你不需要下面的代码,因为你已经有了 Parcelable 数组(showStatisticsObj 是 Parcelable):

// you don't need following code
Parcelable[] passedArray = new Parcelable[totaldifferentDates];
for (int i=0; i<totaldifferentDates; ++i) {
    passedArray[i] = showStatObj[i];
}

因此,您只需将 showStatObj 传递给意图:

Intent displayintent = new Intent(this, DisplayStatistics.class);
displayintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
displayintent.putExtra("bundleObj", showStatObj);
startActivity(displayintent);

最后你从 bundle 中得到它,如下所示:

Parcelable[] ps = bundle.getParcelableArrayExtra();
showStatisticsObj[] uri = new showStatisticsObj[ps.length];
System.arraycopy(ps, 0, uri, 0, ps.length);

您传递了 Parcelable[],因此必须在 bundle 中搜索 Parcelable[],然后将其转换为 showStatisticsObj[]。在 java 中,您不能将 Parcelable[] 转换为 showStatisticsObj[]。

作为对您代码的建议,类名应始终以大写字母开头。所以不是showStatisticsObj,但是ShowStatisticsObj

于 2013-07-13T10:46:50.287 回答
-4

最好实现Serializable接口。它比Parcelable.

检查这个样本:

public class Foo implements Serializable
{
    private static final long   serialVersionUID    = -459713774703414626L;
    public String               m_sName;
    public String               m_spass;
    public int                  m_iAge;
    public boolean              m_bUseAgePremissions;
}

在发送中

Foo MyObj=new Foo()
Bundle bData=new Bundle();
bData.putSerializable("test", MyObj);
Intent myIntent = ...
myIntent .putExtras(bData);

接收中

Bundle bDataReceive = myIntent.getExtras();
Foo MyObj = (Foo)bDataReceive.getSerializable("test");
于 2013-07-13T11:15:00.710 回答