2013-07-13 138 views
3

我想使用Parcelable传递自定义对象的数组。我在我的搜索中发现了一些讨论,如link。我遵循这些例子,但无法找到对象数组的实现。我的问题是对象在新活动中变为空。 我的实现如下。使用Parcelable对象传递对象数组

MY percelable对象

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为空。 有什么不对?请帮帮我。

+0

你初始化showStatObjinDisplay? – amalBit

回答

5

我会尝试改变CREATOR像Minhtdh说。

下你不需要下面的代码,因为你已经有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); 

最后你从这样捆绑它:

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

你通过Parcelable []所以必须s搜索包中的Parcelable [],然后将其转换为showStatisticsObj []。在Java中,您不能将Parcelable []转换为showStatisticsObj []。

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

+0

如果我们需要使用'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中被抹黑http://developer.android.com/reference/java/io/Serializable.html – Jon