2016年12月8日 星期四

Android-Parcelable 的包裝

想必大家對 Serializable 不陌生吧

如果大家對以上的有一定的概念
那麼 Parcelable 就是 Android 專用的序列化協定
-------------------------------
Parcelable
public interface Parcelable

android.os.Parcelable
.
.
.
---------------------------------

最棒的是 Intent 也支援他

1 .實作介面 Parcelable
public class ItemBean implements Parcelable {
    .
    .
    .
}

2 .並且宣告對應的方法
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    // Parcel : 將指定的資料寫入包內( 您宣告的參數 )
}

3 . 最後 Parcelable 必須使用 Creator,把上述的參數再次裝填
public static final Parcelable.Creator<ItemBean> CREATOR = new Creator(){

    @Override
    public Object[] newArray(int size) {
        // Object 更改成您的 Class Name,並且將數量放置在生成的陣列數
        return new Object[size];
    }

    @Override
    public Object createFromParcel(Parcel parcel) {
        // Object 更改成您的 Class Name,Return 放置資料完成後的 Class
        // 將剛剛 writeToParcel 的內容包裝存放
        return null;
    }
};

4 . 範例 : 比如我們建立一個物品的 Bean
可能有物品名稱、物品重量..等
public class ItemBean implements Parcelable {

    private String strItemName;
    private int intItemWeight;

    @Override
    public int describeContents() {
        // 尚未很了解此用途,
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        // Parcel : 將指定的資料寫入包內( 您宣告的參數 )
        // 請依照順序擺放,不然無法對應到
        parcel.writeString(strItemName); // String 型別
        parcel.writeInt(intItemWeight); // int 型別
    }

    /**  Creator  **/
    public static final Parcelable.Creator<ItemBean> CREATOR = new Creator(){

        @Override
        public ItemBean[] newArray(int size) {
            // Object 更改成您的 Class Name,並且將數量放置在生成的陣列數
            return new ItemBean[size];
        }

        @Override
        public ItemBean createFromParcel(Parcel parcel) {
            // 請依照順序擺放,不然無法對應到
            ItemBean itemBean = new ItemBean();
            itemBean.setStrItemName(parcel.readString());
            itemBean.setIntItemWeight(parcel.readInt());
            return itemBean;
        }
    };
    
    /**  Get & Set  **/
    public String getStrItemName() {
        return strItemName;
    }

    public void setStrItemName(String strItemName) {
        this.strItemName = strItemName;
    }

    public int getIntItemWeight() {
        return intItemWeight;
    }

    public void setIntItemWeight(int intItemWeight) {
        this.intItemWeight = intItemWeight;
    }
}

6 .Intent 用法
A 頁面
Intent intent = new Intent(getActivity(), AppleActivity.class);
intent.putExtra("ItemInfo", itemBean);
startActivity(intent);

B 頁面
Intent i = getIntent();
ItemBean itemBean = (ItemBean) i.getParcelableExtra("ItemInfo");
if(itemBean != null) {
    .
    .
    .
}


參考資料 : Android_Parcelable

沒有留言:

張貼留言