2011-09-28 61 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]; 
     } 
    }