使用Parcelable对象传递对象数组

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

我的可 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 是空的。有什么问题吗?请帮帮我。

你有初始化showStatObjinDisplay吗? - amalBit
2个回答

5
我会尝试像Minhtdh所说的那样更改CREATOR。
接下来,您不需要以下代码,因为您已经有了可包含数组(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);

最后,您可以像这样从捆绑包中获取它:
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。

如果我们需要使用putParcelable()呢? - Choletski

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

2
在Android中,Serializable不被推荐使用。http://developer.android.com/reference/java/io/Serializable.html - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接