Search

Android - Activity 傳遞自訂物件參數

2015-10-09 8:14 PM

傳遞字串, 數字等參數的方法我想大家應該都沒問題

但 Intent 就是沒有 putExtra( Object ); 的方法

用 Serializable 又會出現錯誤訊息 而且其實有點偷吃步

正確的方法是應該使用 Parcelable 這個介面來完成

首先須實作 Parcelable 介面

  1. public class ArticleBean implements Parcelable

並在 writeToParcel 將欄位值寫入 Parcel 內

  1. @Override
  2. public void writeToParcel(Parcel dest, int flags) {
  3. dest.writeInt(serialNumber);
  4. dest.writeString(boardTitle);
  5. dest.writeString(aid);
  6. dest.writeString(title);
  7. dest.writeString(status);
  8. dest.writeString(pushes);
  9. dest.writeString(category);
  10. dest.writeString(author);
  11. dest.writeString(date);
  12. dest.writeBooleanArray( new boolean[]{online, read, changed, locked, connected, mail} );
  13. dest.writeString( articleType.getValue() );
  14. dest.writeString(articleHeader.getValue());
  15. }

然後再新增一個 static 的 CREATOR 讓參數可以被重新產生

是的 傳遞到另一個 Activity 的參數是重新產生過的新物件

  1. public static final Parcelable.Creator<ArticleBean> CREATOR = new Parcelable.Creator<ArticleBean>() {
  2. public ArticleBean createFromParcel(Parcel parcel) {
  3. return new ArticleBean(parcel);
  4. }
  5.  
  6. public ArticleBean[] newArray(int size) {
  7. return new ArticleBean[size];
  8. }
  9. };

最後再新增一個使用 Parcel 創建的建構子

重點是所有參數不論型態皆須依照你放入的順序依次取出

例如你第一個放的是字串 第一個取出來的就必須是字串

如果你取得 boolean 他就會報錯

  1. private ArticleBean(Parcel parcel) {
  2. boolean[] booleans = new boolean[6];
  3.  
  4. serialNumber = parcel.readInt();
  5. boardTitle = parcel.readString();
  6. aid = parcel.readString();
  7. title = parcel.readString();
  8. status = parcel.readString();
  9. pushes = parcel.readString();
  10. category = parcel.readString();
  11. author = parcel.readString();
  12. date = parcel.readString();
  13.  
  14. parcel.readBooleanArray(booleans);
  15.  
  16. online = booleans[0];
  17. read = booleans[1];
  18. changed = booleans[2];
  19. locked = booleans[3];
  20. connected = booleans[4];
  21. mail = booleans[5];
  22. articleType = ArticleType.fromValue( parcel.readString() );
  23. articleHeader = ArticleHeader.fromValue( parcel.readString() );
  24. }
  25.  

其中的 ArticleType.fromValue 是我慣用的列舉參數方式

詳細建構方式可以參考這個連結 Google 也愛用的列舉參數建構法

傳遞參數時則一樣使用 intent.putExtra

  1. intent.putExtra( "Article.Bean", articleBean );

取出參數則是使用 getParcelable 取出對應的值

  1. articleBean = getIntent().getExtras().getParcelable("Article.Bean");

以下是完整的 Class 程式碼範例

  1. public class ArticleBean implements Parcelable {
  2.  
  3. private int serialNumber;
  4.  
  5. private String aid;
  6.  
  7. private String boardTitle;
  8.  
  9. private String title;
  10.  
  11. private String status;
  12.  
  13. private String pushes;
  14.  
  15. private String category;
  16.  
  17. private String author;
  18.  
  19. private String date;
  20.  
  21. private boolean online;
  22.  
  23. private boolean read;
  24.  
  25. private boolean changed;
  26.  
  27. private boolean locked;
  28.  
  29. private boolean connected = false;
  30.  
  31. private boolean mail = false;
  32.  
  33. private ArticleType articleType;
  34.  
  35. private ArticleHeader articleHeader;
  36.  
  37. public int getSerialNumber() {
  38. return serialNumber;
  39. }
  40.  
  41. public void setSerialNumber(int serialNumber) {
  42. this.serialNumber = serialNumber;
  43. }
  44.  
  45. public String getAid() {
  46. return aid;
  47. }
  48.  
  49. public void setAid(String aid) {
  50. this.aid = aid;
  51. }
  52.  
  53. public String getBoardTitle() {
  54. return boardTitle;
  55. }
  56.  
  57. public void setBoardTitle(String boardTitle) {
  58. this.boardTitle = boardTitle;
  59. }
  60.  
  61. public String getTitle() {
  62. return title;
  63. }
  64.  
  65. public void setTitle(String title) {
  66. this.title = title;
  67. }
  68.  
  69. public String getStatus() {
  70. return status;
  71. }
  72.  
  73. public void setStatus(String status) {
  74. this.status = status;
  75. }
  76.  
  77. public String getPushes() {
  78. return pushes;
  79. }
  80.  
  81. public void setPushes(String pushes) {
  82. this.pushes = pushes;
  83. }
  84.  
  85. public String getCategory() {
  86. return category;
  87. }
  88.  
  89. public void setCategory(String category) {
  90. this.category = category;
  91. }
  92.  
  93. public String getAuthor() {
  94. return author;
  95. }
  96.  
  97. public void setAuthor(String author) {
  98. this.author = author;
  99. }
  100.  
  101. public String getDate() {
  102. return date;
  103. }
  104.  
  105. public void setDate(String date) {
  106. this.date = date;
  107. }
  108.  
  109. public boolean isOnline() {
  110. return online;
  111. }
  112.  
  113. public void setOnline(boolean online) {
  114. this.online = online;
  115. }
  116.  
  117. public boolean isRead() {
  118. return read;
  119. }
  120.  
  121. public void setRead(boolean read) {
  122. this.read = read;
  123. }
  124.  
  125. public boolean isChanged() {
  126. return changed;
  127. }
  128.  
  129. public void setChanged(boolean changed) {
  130. this.changed = changed;
  131. }
  132.  
  133. public boolean isLocked() {
  134. return locked;
  135. }
  136.  
  137. public void setLocked(boolean locked) {
  138. this.locked = locked;
  139. }
  140.  
  141. public boolean isConnected() {
  142. return connected;
  143. }
  144.  
  145. public void setConnected(boolean connected) {
  146. this.connected = connected;
  147. }
  148.  
  149. public boolean isMail() {
  150. return mail;
  151. }
  152.  
  153. public void setMail(boolean mail) {
  154. this.mail = mail;
  155. }
  156.  
  157. public ArticleType getArticleType() {
  158. return articleType;
  159. }
  160.  
  161. public void setArticleType(ArticleType articleType) {
  162. this.articleType = articleType;
  163. }
  164.  
  165. public ArticleHeader getArticleHeader() {
  166. return articleHeader;
  167. }
  168.  
  169. public void setArticleHeader(ArticleHeader articleHeader) {
  170. this.articleHeader = articleHeader;
  171. }
  172.  
  173. @Override
  174. public int describeContents() {
  175. return 0;
  176. }
  177.  
  178. @Override
  179. public void writeToParcel(Parcel dest, int flags) {
  180. dest.writeInt(serialNumber);
  181. dest.writeString(boardTitle);
  182. dest.writeString(aid);
  183. dest.writeString(title);
  184. dest.writeString(status);
  185. dest.writeString(pushes);
  186. dest.writeString(category);
  187. dest.writeString(author);
  188. dest.writeString(date);
  189. dest.writeBooleanArray( new boolean[]{online, read, changed, locked, connected, mail} );
  190. dest.writeString( articleType.getValue() );
  191. dest.writeString(articleHeader.getValue());
  192. }
  193.  
  194. // 傳遞參數時 將會呼叫此方法重新創建物件
  195. public static final Parcelable.Creator<ArticleBean> CREATOR =
  196. new Parcelable.Creator<ArticleBean>() {
  197. public ArticleBean createFromParcel(Parcel parcel) {
  198. return new ArticleBean(parcel);
  199. }
  200.  
  201. public ArticleBean[] newArray(int size) {
  202. return new ArticleBean[size];
  203. }
  204. };
  205.  
  206. private ArticleBean() {}
  207.  
  208. // 以 Parcel 創建的建構子
  209. private ArticleBean(Parcel parcel) {
  210. boolean[] booleans = new boolean[6];
  211.  
  212. // 所有參數皆須按照加入的順序取出
  213. serialNumber = parcel.readInt();
  214. boardTitle = parcel.readString();
  215. aid = parcel.readString();
  216. title = parcel.readString();
  217. status = parcel.readString();
  218. pushes = parcel.readString();
  219. category = parcel.readString();
  220. author = parcel.readString();
  221. date = parcel.readString();
  222.  
  223. parcel.readBooleanArray(booleans);
  224.  
  225. online = booleans[0];
  226. read = booleans[1];
  227. changed = booleans[2];
  228. locked = booleans[3];
  229. connected = booleans[4];
  230. mail = booleans[5];
  231. articleType = ArticleType.fromValue( parcel.readString() );
  232. articleHeader = ArticleHeader.fromValue( parcel.readString() );
  233. }
  234.  
  235. public static class Builder {
  236. private int serialNumber;
  237. private String aid;
  238. private String boardTitle;
  239. private String title;
  240. private String status;
  241. private String pushes;
  242. private String category;
  243. private String author;
  244. private String date;
  245. private boolean online;
  246. private boolean read;
  247. private boolean changed;
  248. private boolean locked;
  249. private boolean connected = false;
  250. private boolean mail = false;
  251. private ArticleType articleType;
  252. private ArticleHeader articleHeader;
  253.  
  254. private Builder() {
  255. }
  256.  
  257. public static Builder anArticleBean() {
  258. return new Builder();
  259. }
  260.  
  261. public Builder withSerialNumber(int serialNumber) {
  262. this.serialNumber = serialNumber;
  263. return this;
  264. }
  265.  
  266. public Builder withAid(String aid) {
  267. this.aid = aid;
  268. return this;
  269. }
  270.  
  271. public Builder withBoardTitle(String boardTitle) {
  272. this.boardTitle = boardTitle;
  273. return this;
  274. }
  275.  
  276. public Builder withTitle(String title) {
  277. this.title = title;
  278. return this;
  279. }
  280.  
  281. public Builder withStatus(String status) {
  282. this.status = status;
  283. return this;
  284. }
  285.  
  286. public Builder withPushes(String pushes) {
  287. this.pushes = pushes;
  288. return this;
  289. }
  290.  
  291. public Builder withCategory(String category) {
  292. this.category = category;
  293. return this;
  294. }
  295.  
  296. public Builder withAuthor(String author) {
  297. this.author = author;
  298. return this;
  299. }
  300.  
  301. public Builder withDate(String date) {
  302. this.date = date;
  303. return this;
  304. }
  305.  
  306. public Builder withOnline(boolean online) {
  307. this.online = online;
  308. return this;
  309. }
  310.  
  311. public Builder withRead(boolean read) {
  312. this.read = read;
  313. return this;
  314. }
  315.  
  316. public Builder withChanged(boolean changed) {
  317. this.changed = changed;
  318. return this;
  319. }
  320.  
  321. public Builder withLocked(boolean locked) {
  322. this.locked = locked;
  323. return this;
  324. }
  325.  
  326. public Builder withConnected(boolean connected) {
  327. this.connected = connected;
  328. return this;
  329. }
  330.  
  331. public Builder withMail(boolean mail) {
  332. this.mail = mail;
  333. return this;
  334. }
  335.  
  336. public Builder withArticleType(ArticleType articleType) {
  337. this.articleType = articleType;
  338. return this;
  339. }
  340.  
  341. public Builder withArticleHeader(ArticleHeader articleHeader) {
  342. this.articleHeader = articleHeader;
  343. return this;
  344. }
  345.  
  346. public Builder but() {
  347. 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);
  348. }
  349.  
  350. public ArticleBean build() {
  351. ArticleBean articleBean = new ArticleBean();
  352. articleBean.setSerialNumber(serialNumber);
  353. articleBean.setAid(aid);
  354. articleBean.setBoardTitle(boardTitle);
  355. articleBean.setTitle(title);
  356. articleBean.setStatus(status);
  357. articleBean.setPushes(pushes);
  358. articleBean.setCategory(category);
  359. articleBean.setAuthor(author);
  360. articleBean.setDate(date);
  361. articleBean.setOnline(online);
  362. articleBean.setRead(read);
  363. articleBean.setChanged(changed);
  364. articleBean.setLocked(locked);
  365. articleBean.setConnected(connected);
  366. articleBean.setMail(mail);
  367. articleBean.setArticleType(articleType);
  368. articleBean.setArticleHeader(articleHeader);
  369. return articleBean;
  370. }
  371. }
  372. }
各項資料連結
Android Parcelable
Google 也愛用的列舉參數建構法

No comments:

Post a Comment