0

Recipeクラスを実装している次のクラスがありますParcelable。しかし、あるクラスから別のクラスにオブジェクトを渡すと、その属性の値はnull. なぜ?

レシピクラス:

package mobile.bh.classes;

import java.util.ArrayList;

import mobile.bh.activities.MethodStep;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

//simple class that just has one member property as an example
public class Recipe implements Parcelable {
    public int id;
    public String name;
    public ArrayList<Ingredient> ingredients;
    public ArrayList<MethodStep> method;
    public String comment;
    public String image;
    public Bitmap image2;

    public Recipe(){}
    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(name);
        out.writeList(ingredients);
        out.writeList(method);
        out.writeString(comment);
        out.writeString(image);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<Recipe> CREATOR = new Parcelable.Creator<Recipe>() {
        public Recipe createFromParcel(Parcel in) {
            return new Recipe(in);
        }

        public Recipe[] newArray(int size) {
            return new Recipe[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private Recipe(Parcel in) {
        in.writeInt(id);
        in.writeString(name);
        in.writeList(ingredients);
        in.writeList(method);
        in.writeString(comment);
        in.writeString(image);
        }
}

オブジェクトを送信するintent

    Intent i = new Intent(context,RecipeInfoActivity.class);
    i.putExtra("recipeObj", recipe);

反対側でオブジェクトを受け取る

Recipe p = (Recipe) getIntent().getParcelableExtra("recipeObj");

しかし、の値p.namenull

4

3 に答える 3

1

Parcelable コンストラクターでは、パーセルから読み返す必要があります。

private Recipe(Parcel in) {
        id = in.readInt();
        name =in.readString();
        ingredients = in.readList();
        method = in.readList();
        comment = in.readString();
        }
于 2012-08-24T14:49:14.833 に答える
0

コンストラクターで writeInt の代わりに readInt を使用する必要があります (その他のフィールドについては etc)。

于 2012-08-24T14:48:56.907 に答える
0

まず第一に、コンストラクターでは、すべてのプロパティをパーセルに書き込もうとしているように見えますが、私が知る限り、それらはまだ設定されていません。もしかしてそこの小包から読むつもりだったの?このパーセルが正確に何であるかはわかりませんが、ある種のプロパティのようなクラスだと思いますか? その場合、Java は参照渡しではありません。つまり、メソッドに渡された値を変更しても、実際のパーセルの値は変更されません。変更したパーセルを返す必要があります。

于 2012-08-24T14:49:23.160 に答える