2015-10-09
8:14 PM
傳遞字串, 數字等參數的方法我想大家應該都沒問題
但 Intent 就是沒有 putExtra( Object ); 的方法
用 Serializable 又會出現錯誤訊息 而且其實有點偷吃步
正確的方法是應該使用 Parcelable 這個介面來完成
首先須實作 Parcelable 介面
public class ArticleBean implements Parcelable
並在 writeToParcel 將欄位值寫入 Parcel 內
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(serialNumber);
dest.writeString(boardTitle);
dest.writeString(aid);
dest.writeString(title);
dest.writeString(status);
dest.writeString(pushes);
dest.writeString(category);
dest.writeString(author);
dest.writeString(date);
dest.writeBooleanArray( new boolean[]{online, read, changed, locked, connected, mail} );
dest.writeString( articleType.getValue() );
dest.writeString(articleHeader.getValue());
}
然後再新增一個 static 的 CREATOR 讓參數可以被重新產生
是的 傳遞到另一個 Activity 的參數是重新產生過的新物件
public static final Parcelable.Creator<ArticleBean> CREATOR = new Parcelable.Creator<ArticleBean>() {
public ArticleBean createFromParcel(Parcel parcel) {
return new ArticleBean(parcel);
}
public ArticleBean[] newArray(int size) {
return new ArticleBean[size];
}
};
最後再新增一個使用 Parcel 創建的建構子
重點是所有參數不論型態皆須依照你放入的順序依次取出
例如你第一個放的是字串 第一個取出來的就必須是字串
如果你取得 boolean 他就會報錯
private ArticleBean(Parcel parcel) {
boolean[] booleans = new boolean[6];
serialNumber = parcel.readInt();
boardTitle = parcel.readString();
aid = parcel.readString();
title = parcel.readString();
status = parcel.readString();
pushes = parcel.readString();
category = parcel.readString();
author = parcel.readString();
date = parcel.readString();
parcel.readBooleanArray(booleans);
online = booleans[0];
read = booleans[1];
changed = booleans[2];
locked = booleans[3];
connected = booleans[4];
mail = booleans[5];
articleType = ArticleType.fromValue( parcel.readString() );
articleHeader = ArticleHeader.fromValue( parcel.readString() );
}
其中的 ArticleType.fromValue 是我慣用的列舉參數方式
詳細建構方式可以參考這個連結 Google 也愛用的列舉參數建構法
傳遞參數時則一樣使用 intent.putExtra
intent.putExtra( "Article.Bean", articleBean );
取出參數則是使用 getParcelable 取出對應的值
articleBean = getIntent().getExtras().getParcelable("Article.Bean");
以下是完整的 Class 程式碼範例
public class ArticleBean implements Parcelable {
private int serialNumber;
private String aid;
private String boardTitle;
private String title;
private String status;
private String pushes;
private String category;
private String author;
private String date;
private boolean online;
private boolean read;
private boolean changed;
private boolean locked;
private boolean connected = false;
private boolean mail = false;
private ArticleType articleType;
private ArticleHeader articleHeader;
public int getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(int serialNumber) {
this.serialNumber = serialNumber;
}
public String getAid() {
return aid;
}
public void setAid(String aid) {
this.aid = aid;
}
public String getBoardTitle() {
return boardTitle;
}
public void setBoardTitle(String boardTitle) {
this.boardTitle = boardTitle;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getPushes() {
return pushes;
}
public void setPushes(String pushes) {
this.pushes = pushes;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public boolean isOnline() {
return online;
}
public void setOnline(boolean online) {
this.online = online;
}
public boolean isRead() {
return read;
}
public void setRead(boolean read) {
this.read = read;
}
public boolean isChanged() {
return changed;
}
public void setChanged(boolean changed) {
this.changed = changed;
}
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
public boolean isConnected() {
return connected;
}
public void setConnected(boolean connected) {
this.connected = connected;
}
public boolean isMail() {
return mail;
}
public void setMail(boolean mail) {
this.mail = mail;
}
public ArticleType getArticleType() {
return articleType;
}
public void setArticleType(ArticleType articleType) {
this.articleType = articleType;
}
public ArticleHeader getArticleHeader() {
return articleHeader;
}
public void setArticleHeader(ArticleHeader articleHeader) {
this.articleHeader = articleHeader;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(serialNumber);
dest.writeString(boardTitle);
dest.writeString(aid);
dest.writeString(title);
dest.writeString(status);
dest.writeString(pushes);
dest.writeString(category);
dest.writeString(author);
dest.writeString(date);
dest.writeBooleanArray( new boolean[]{online, read, changed, locked, connected, mail} );
dest.writeString( articleType.getValue() );
dest.writeString(articleHeader.getValue());
}
// 傳遞參數時 將會呼叫此方法重新創建物件
public static final Parcelable.Creator<ArticleBean> CREATOR =
new Parcelable.Creator<ArticleBean>() {
public ArticleBean createFromParcel(Parcel parcel) {
return new ArticleBean(parcel);
}
public ArticleBean[] newArray(int size) {
return new ArticleBean[size];
}
};
private ArticleBean() {}
// 以 Parcel 創建的建構子
private ArticleBean(Parcel parcel) {
boolean[] booleans = new boolean[6];
// 所有參數皆須按照加入的順序取出
serialNumber = parcel.readInt();
boardTitle = parcel.readString();
aid = parcel.readString();
title = parcel.readString();
status = parcel.readString();
pushes = parcel.readString();
category = parcel.readString();
author = parcel.readString();
date = parcel.readString();
parcel.readBooleanArray(booleans);
online = booleans[0];
read = booleans[1];
changed = booleans[2];
locked = booleans[3];
connected = booleans[4];
mail = booleans[5];
articleType = ArticleType.fromValue( parcel.readString() );
articleHeader = ArticleHeader.fromValue( parcel.readString() );
}
public static class Builder {
private int serialNumber;
private String aid;
private String boardTitle;
private String title;
private String status;
private String pushes;
private String category;
private String author;
private String date;
private boolean online;
private boolean read;
private boolean changed;
private boolean locked;
private boolean connected = false;
private boolean mail = false;
private ArticleType articleType;
private ArticleHeader articleHeader;
private Builder() {
}
public static Builder anArticleBean() {
return new Builder();
}
public Builder withSerialNumber(int serialNumber) {
this.serialNumber = serialNumber;
return this;
}
public Builder withAid(String aid) {
this.aid = aid;
return this;
}
public Builder withBoardTitle(String boardTitle) {
this.boardTitle = boardTitle;
return this;
}
public Builder withTitle(String title) {
this.title = title;
return this;
}
public Builder withStatus(String status) {
this.status = status;
return this;
}
public Builder withPushes(String pushes) {
this.pushes = pushes;
return this;
}
public Builder withCategory(String category) {
this.category = category;
return this;
}
public Builder withAuthor(String author) {
this.author = author;
return this;
}
public Builder withDate(String date) {
this.date = date;
return this;
}
public Builder withOnline(boolean online) {
this.online = online;
return this;
}
public Builder withRead(boolean read) {
this.read = read;
return this;
}
public Builder withChanged(boolean changed) {
this.changed = changed;
return this;
}
public Builder withLocked(boolean locked) {
this.locked = locked;
return this;
}
public Builder withConnected(boolean connected) {
this.connected = connected;
return this;
}
public Builder withMail(boolean mail) {
this.mail = mail;
return this;
}
public Builder withArticleType(ArticleType articleType) {
this.articleType = articleType;
return this;
}
public Builder withArticleHeader(ArticleHeader articleHeader) {
this.articleHeader = articleHeader;
return this;
}
public Builder but() {
return anArticleBean().withSerialNumber(serialNumber).withAid(aid).withBoardTitle(boardTitle).withTitle(title).withStatus(status).withPushes(pushes).withCategory(category).withAuthor(author).withDate(date).withOnline(online).withRead(read).withChanged(changed).withLocked(locked).withConnected(connected).withMail(mail).withArticleType(articleType).withArticleHeader(articleHeader);
}
public ArticleBean build() {
ArticleBean articleBean = new ArticleBean();
articleBean.setSerialNumber(serialNumber);
articleBean.setAid(aid);
articleBean.setBoardTitle(boardTitle);
articleBean.setTitle(title);
articleBean.setStatus(status);
articleBean.setPushes(pushes);
articleBean.setCategory(category);
articleBean.setAuthor(author);
articleBean.setDate(date);
articleBean.setOnline(online);
articleBean.setRead(read);
articleBean.setChanged(changed);
articleBean.setLocked(locked);
articleBean.setConnected(connected);
articleBean.setMail(mail);
articleBean.setArticleType(articleType);
articleBean.setArticleHeader(articleHeader);
return articleBean;
}
}
}
各項資料連結
Android Parcelable
Google 也愛用的列舉參數建構法
No comments:
Post a Comment