简体   繁体   中英

Why is my parceled object coming back as null? Android Dev

I've been trying to parcel an object and return it's value to the MainActivity method. All of the object's properties have been assigned, when I Log the mItem object in my AddItemActivity before parceling it all checks out. Somewhere along the way my data is getting lost... whether it is from the very beginning of my creation of a new Intent, or whether it is on the receiving end in MainActivity. What I am trying to do... is to take the user input, create an item object, pass that object to MainActivity, and add it to Inventory. Any ideas?

Here's MainActivity:

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.gardnerwebideas.inventorytracker.R;
import com.gardnerwebideas.inventorytracker.adapters.ItemAdapter;
import com.gardnerwebideas.inventorytracker.models.Inventory;
import com.gardnerwebideas.inventorytracker.models.Item;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends ListActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private Item mNewItem;
    private Inventory mInventory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button addButton = (Button) findViewById(R.id.addToInventoryButton);

        mInventory = new Inventory();
        mNewItem = new Item();

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addToInventory();
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode) {
            case (1): {
                if (resultCode == Activity.RESULT_OK) {
                    Intent intent = getIntent();
                    mNewItem = intent.getParcelableExtra(AddItemActivity.ADD_ITEM);
                    new ItemAdapter(this, mInventory);
                    Toast.makeText(this,
                            "Inventory size: "
                                    + String.valueOf(mInventory.getSize())
                                    + mInventory.toString(),
                            Toast.LENGTH_LONG).show();
                }
                break;
            }
            default:
                break;
        }
    }

    public void addToInventory() {
        Intent intent = new Intent(this, AddItemActivity.class);
        startActivityForResult(intent, 1);
    }

}

Here's AddItemActivity:

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.gardnerwebideas.inventorytracker.models.Item;
import com.gardnerwebideas.inventorytracker.R;

import java.util.Date;

public class AddItemActivity extends AppCompatActivity {

    public static final String TAG = AddItemActivity.class.getSimpleName();

    public static final String ADD_ITEM = "ADD_ITEM";
    private Item mItem;
    private String mName;
    private String mDate;
    private String mDescription;
    private String mPrice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_item);

        Button addButton = (Button) findViewById(R.id.addButton);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createNewItem();
                mItem = new Item(mName, mDescription, mPrice, mDate);
                Log.d(TAG, "THE ITEM IS: " + mItem.toString());

                Intent intent = new Intent();
                intent.putExtra(ADD_ITEM, mItem);
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        });

    }

    private void createNewItem() {
        EditText itemName = (EditText) findViewById(R.id.nameField);
        EditText itemDescription = (EditText) findViewById(R.id.descriptionField);
        EditText itemPrice = (EditText) findViewById(R.id.priceField);

        mName = itemName.getText().toString();
        mDescription = itemDescription.getText().toString();
        mPrice = itemPrice.getText().toString();
        mDate = String.valueOf(new Date());
    }

}

The Item class:

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

import java.util.Date;

public class Item implements Parcelable {

    private String mName;
    private String mInventoryDate;
    private String mDescription;
    private String mPrice;

    public Item(String name, String description, String price, String stringDate) {
        mName = name;
        mInventoryDate = stringDate;
        mDescription = description;
        mPrice = price;
    }

    public String[] getItemInfo() {
        String[] itemInfo = {mName, mDescription, mInventoryDate, mPrice};
        return itemInfo;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    public String getInventoryDate() {
        return mInventoryDate;
    }

    public void setInventoryDate(String stringDate) {
        mInventoryDate = stringDate;
    }

    public String getDescription() {
        return mDescription;
    }

    public void setDescription(String description) {
        mDescription = description;
    }

    public String getPrice() {
        return mPrice;
    }

    public void setPrice(String price) {
        mPrice = price;
    }

    @Override
    public String toString() {
        return mName + " " + mInventoryDate + " " + mDescription + " " + mPrice;
    }

    @Override
    public int describeContents() {
        return 0; //Not necessary...
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mName);
        dest.writeString(mInventoryDate);
        dest.writeString(mDescription);
        dest.writeString(mPrice);
    }

    private Item(Parcel in) {
        mName = in.readString();
        mInventoryDate = in.readString();
        mDescription = in.readString();
        mPrice = in.readString();
    }

    public static final Creator<Item> CREATOR = new Creator<Item>() {
        @Override
        public Item createFromParcel(Parcel source) {
            return new Item(source);
        }

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

}

And the Inventory class:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Inventory {

    private List<Item> mInventoryItems;

    public Inventory() {
        mInventoryItems = new ArrayList<>();
    }

    public int getSize() {
        return mInventoryItems.size();
    }

    public void addItem(Item item) {
        mInventoryItems.add(item);
    }

    public Item getPosition(int position) {
        return mInventoryItems.get(position);
    }

    public List<Item> getInventoryItems() {
        return mInventoryItems;
    }

    public void setInventoryItems(List<Item> items) {
        mInventoryItems = items;
    }

    @Override
    public String toString() {
        return "Inventory{" +
                "mInventoryItems=" + mInventoryItems +
                '}';
    }

}

I've been at this for about 18hrs trying to figure it out and I'm just missing some final piece to this, I just know it.

The problem is in your onActivityResult() method, where you call:

Intent intent = getIntent();

getIntent() returns the Intent that was used to create the Activity. You want to use the Intent passed into the onActivityResult() method., so:

mNewItem = data.getParcelableExtra(AddItemActivity.ADD_ITEM);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM