簡體   English   中英

在意圖之間傳遞可包裹對象

[英]Passing Parcelable Object between Intents

我在傳遞事件之間創建的對象時遇到問題。 我使用http://www.parcelabler.com/網站創建了代碼的parcelable元素。 對象類如下所示:(Item類是另一個包含Strings和doubles的簡單對象,也已使其可拆分)

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;

public class Diner implements Parcelable {

    private String name;
    private ArrayList<Item> itemList = new ArrayList<Item>();

    public Diner(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void addItem(Item foodItem) {
        itemList.add(foodItem);
        foodItem.incrementBuyerCount();
    }

    public double getPrice() {
        double total = 0;
        for(Item item : itemList) {
            total += item.getPrice() / item.getBuyerCount();
        }
        return total;
    }


    protected Diner(Parcel in) {
        name = in.readString();
        if (in.readByte() == 0x01) {
            itemList = new ArrayList<Item>();
            in.readList(itemList, Item.class.getClassLoader());
        } else {
            itemList = null;
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        if (itemList == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeList(itemList);
        }
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Diner> CREATOR = new Parcelable.Creator<Diner>() {
        @Override
        public Diner createFromParcel(Parcel in) {
            return new Diner(in);
        }

        @Override
        public Diner[] newArray(int size) {
            return new Diner[size];
        }
    };
}

在我的主要活動中,我有一個按鈕,當按下按鈕並等待結果時,該按鈕將打開“添加晚餐”活動。

private final int SET_REQUEST = 1;

addDinerButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getApplicationContext(), AddDinerActivity.class);
        startActivityForResult(intent, SET_REQUEST);
    }
});

將打開“添加用餐者”活動,用戶在用餐者名稱EditText中輸入一個字符串,該字符串將用於創建新的用餐者對象,並在按下“確定”按鈕時返回到主活動。

okButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = getIntent();
        Diner newDiner = new Diner(dinerNameEditText.getText().toString());
        intent.putExtra("newDiner", newDiner);
        setResult(RESULT_OK, intent);
        finish();
    }
});

最后,接收Diner對象並將其添加到main活動的數組中:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == RESULT_OK) {
        if(requestCode == SET_REQUEST) {
            Diner newDiner = getIntent().getParcelableExtra("newDiner");
            dinerList.add(newDiner);
        }
    }
}

不幸的是,當我嘗試保存Diner對象並將其傳遞給main活動時,我的代碼崩潰了,有人可以看到為什么嗎?

使用onActivityResult方法的data第三個參數而不是getIntent()來從Intent獲取數據,該數據是從使用startActivityForResult啟動的Activity發送的:

Diner newDiner = data.getParcelableExtra("newDiner");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM