Reputation: 95
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.
Upvotes: 2
Views: 1034
Reputation: 10540
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);
Upvotes: 3