1

Parcelable を使用して 1 つのアクティビティから別のアクティビティにオブジェクトを渡すのにひどく行き詰まっていますが、行Log.i("Name",""+rcp.getName());で null ポインター例外が発生しています。この行を以下のコードで確認できます。最後にCookingDataModelクラスのコードを確認してください。

オブジェクト受信アクティビティのコードは次のとおりです

protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);// No title to display
        setContentView(R.layout.recipe_ingredient_detail);

        CookingDataModel cook = new CookingDataModel();
        RecipeDataModel rcp;
        ArrayList<IngredientDataModel> ing;

        Bundle bundle  = this.getIntent().getExtras();
        if(bundle!=null)
        cook = bundle.getParcelable("Cooking");

        rcp = cook.getRecipe();
        ing = cook.getIngredientList();


        Log.i("Name",""+rcp.getName());
        Log.i("Decrp",""+rcp.getDescription());
        Log.i("Duration",""+rcp.getPrepTime());
        Log.i("Instructions",""+rcp.getInstructions());

        for(int k = 0; k < ing.size(); k++)
        {
            Log.i("Item Name",""+ing.get(k).getItemName());
            Log.i("Item Amount",""+ing.get(k).getItemAmount());
        }
    }

のオブジェクトを送信するコードは次のとおりですCookingDataModel

ListView recepeListView = getListView();
        recepeListView.setOnItemClickListener(new OnItemClickListener() 
        {
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) 
            {
                CookingDataModel cook = recpeList.get(position);

                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putParcelable("Cooking",cook);
                intent.putExtras(bundle);
                intent.setClass(RecipeList.this,RecipeIngredientDetail.class);
                startActivity(intent);

            }
        });

これが CookingDataModel クラスのコードです。

public class CookingDataModel implements Parcelable{

    private RecipeDataModel recipe = null;
    private ArrayList<IngredientDataModel> ingredientList = null;

    public RecipeDataModel getRecipe() {
        return recipe;
    }
    public void setRecipe(RecipeDataModel recipe) {
        this.recipe = recipe;
    }
    public ArrayList<IngredientDataModel> getIngredientList() {
        return ingredientList;
    }
    public void setIngredientList(ArrayList<IngredientDataModel> ingredientList) {
        this.ingredientList = ingredientList;
    }

    public static final Parcelable.Creator<CookingDataModel> CREATOR = new Parcelable.Creator<CookingDataModel>() 
    {
        public CookingDataModel createFromParcel(Parcel in) 
        {
            return new CookingDataModel(in);
        }

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

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel arg0, int arg1) {
        // TODO Auto-generated method stub

    }

    public CookingDataModel(Parcel in) {
        // TODO Auto-generated constructor stub

    }

    public CookingDataModel() 
    {
    }
}

この点で私がプロジェクトを進めることができるように助けてください. 事前に感謝します。

4

2 に答える 2

0

変更が必要なものはほとんどありません。

  1. 新しいオブジェクトを作成する必要はありません。上書きされます。

    CookingDataModel cook = new CookingDataModel();

  2. インテント エクストラから Parcelable オブジェクトを取得するときに型キャストします。

    cook = bundle.getParcelable("クッキング");

  3. オブジェクトを送信するときは、有効な受信メンバーがあることを確認してください。お気づきのように、Intent から CookingDataModel を取得できます。また、このオブジェクトから Receipe も取得できますが、ReceipeModel からデータを取得することはできません。送信アクティビティのコードからは、CookingDataModel.Receipe が有効なオブジェクトかどうかはわかりません。

于 2013-10-02T12:36:31.413 に答える