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