2013-07-13 139 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