2011-09-28 49 views
1

我想創建一個Parcelable類。該類擴展的TableRow:幫助創建一個Parcelable類

import android.content.Context; 
import android.os.Parcel; 
import android.os.Parcelable; 
import android.widget.TableRow; 

public class AcmTableRow extends TableRow implements Parcelable{ 

private int index; 
public boolean isSection; 
private String volumeLink; 
private String rowId; 
private String cfr; 
private static Context context; 
public AcmTableRow(Context context) { 

    super(context); 

} 
public AcmTableRow(Context context, Parcel in) {    
    super(context); 
    AcmTableRow.context = context; 
    readFromParcel(in); 
} 

private void readFromParcel(Parcel in) { 

    //strValue = in.readString(); 
    //intValue = in.readInt(); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    //dest.writeString(strValue); 
    //dest.writeInt(intValue); 
} 


public void setIndex(int index) { 
    this.index = index; 
} 

public int getIndex() { 
    return index; 
} 

public void setRowId(String rowId) { 
    this.rowId = rowId; 
} 

public String getRowId() { 
    return rowId; 
} 

public void setCfr(String cfr) { 
    this.cfr = cfr; 
} 

public String getCfr() { 
    return cfr; 
} 

public void setVolumeLink(String volumeLink) { 
    this.volumeLink = volumeLink; 
} 

public String getVolumeLink() { 
    return volumeLink; 
} 

public static final Parcelable.Creator<AcmTableRow> CREATOR = new Parcelable.Creator<AcmTableRow>() { 
     public AcmTableRow createFromParcel(Parcel in) {    
      return new AcmTableRow(context, in); 
     } 
     public AcmTableRow[] newArray(int size) { 
      return new AcmTableRow[size]; 
     } 
    }; 

} 

我很困惑,我需要把:

readFromParcel(Parcel in) 

而且

writeToParcel(Parcel dest, int flags) 

任何解釋或幫助是極大的讚賞。

謝謝

菲爾

+0

爲什麼你需要包裹一個視圖?我強烈地感覺到這些觀點不應該通過「意圖」傳遞。也許你只需要將你的邏輯與視圖('TableRow')分開而不是擴展它? – ernazm

+0

我的TableRow視圖正在通過AsyncTask在TableRow Factory中創建。該任務非常耗時,牽扯數據並構建視圖,因此需要在UI線程之外完成。 – PhillyNJ

回答

1

的writeToParcel方法簡單地拉平對象成一個包裹。當你需要在活動之間傳遞你的對象時,你會使用它。在你的情況下,它應該是這樣的:

public void writeToParcel (Parcel dest, int flags) 
{ 
    dest.writeInt(index); 
    dest.writeBoolean(isSection); 
    dest.writeString(volumeLink); 
    dest.writeString(rowId); 
    dest.writeString(cfr);  

} 

我從來沒有使用readFromParcel,我不知道你需要在這裏無論是。當您在下一個活動中調用適當的方法時,將從包裹創建對象。

只是一個簡短的提示,你可能不想在你的parcelable類中傳遞上下文。我甚至不確定你可以。當您稍後再次填充可分析對象時,您需要分配上下文。

+0

只是跟進。我能夠將上下文傳遞給parcelable類,沒有任何問題。 thx尋求幫助。 – PhillyNJ

+0

你能發佈你如何設法將上下文傳遞到可發佈的內容嗎? – 3c71

0

這是一個簡單的工作Parcelable例如:

public class ParcelableExample implements Parcelable { 
    private int intMember; 
    private String stringMember; 

    /* 
    * Getters and setters 
    * .... 
    */ 
    /* 
    * Constructors 
    * .... 
    */ 

    /* 
     * Custom parcelable implementation 
     */ 

    private ParcelableExample(Parcel in) { 
     // notice that we are reading in the same order as we have written 
     intMember = in.readInt(); 
     stringMember = in.readString(); 
    } 

    @Override 
    public int describeContents() { 
     return hashCode(); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(intMember); 
     dest.writeString(stringMember); 
    } 

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