java - 在 Intent 之间传递 Parcelable 对象

标签 java android android-intent parcelable

我在传递我在事件之间创建的对象时遇到问题。我用的网站http://www.parcelabler.com/创建代码的 parcelable 元素。对象类如下所示:(Item 类是另一个简单的对象,包含字符串和 double ,也可以打包)

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];
        }
    };
}

在我的主要 Activity 中,我有一个按钮,当按下按钮并等待结果时,它会打开“添加晚餐” Activity 。

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);
    }
});

Add Diner Activity 已打开,用户在 Diner Name EditText 中输入一个字符串,该字符串用于创建新的 Diner 对象并在按下 OK 按钮时返回到主 Activity 。

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 对象被接收并添加到主 Activity 中的数组中:

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 对象并将其传递给主要 Activity 时,我的代码崩溃了,有人能看出这是为什么吗?

最佳答案

使用 onActivityResult 方法的第三个参数 data 而不是 getIntent() 从 Intent 中获取数据,该 Intent 是从 Activity 开始使用的startActivityForResult :

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

关于java - 在 Intent 之间传递 Parcelable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166753/

相关文章:

java - 如何从返回 double 组的方法中获取所有 double 值?

java - web.xml 文档中根元素后面的标记必须格式正确

android - textIsSelectable 属性不适用于工具栏

Android:PopupWindow.showAtLocation()

android4.0 :Unable to instantiate application android. app.Application : java. lang.NullPointerException

java - 如何自动打印 PDF

java - Spark Elasticsearch : Multiple ES-Hadoop versions detected in the classpath

使用 phonegap 的 Android cookie

android - 窗口已经聚焦 - 忽略 com.android.internal.view 的聚焦增益

java - 我如何知道上下文是 Activity 还是 IntentService?