2015-10-26 85 views
2

我一直在试图包裹一个对象并将它的值返回给MainActivity方法。当我将AddItemActivity中的mItem对象记录到分段之前,所有对象的属性都已分配。一路上我的数据正在迷失......无论是从创建新Intent的一开始,还是它在MainActivity的接收端。我正在尝试做的是接受用户输入,创建一个项目对象,将该对象传递给MainActivity,并将其添加到Inventory中。有任何想法吗?为什么我的包裹对象返回为null? Android Dev

这里的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); 
    } 

} 

这里的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()); 
    } 

} 

Item类:

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

} 

和库存数量级:

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 + 
       '}'; 
    } 

} 

我一直在这里约18小时试图找出它,我只是错过了一些最后一块,我只知道它。

+0

看来你忘记调用'mInventory.addItem'在'MainActivity'的''onActivityResult。 – shhp

+0

是的。我故意这样做,因为当我打印出mInventory时,它会回到空白状态。所以这是一个问题,实际对象被包裹......通过为空,我无法弄清楚如何或为什么。我还会补充一点,当我获得mInventory.size()时,它会显示它随着用户添加到他们的库存而增加。 – Wilson

+0

你的意思是'intent.getParcelableExtra(AddItemActivity.ADD_ITEM)'返回null? – shhp

回答

3

的问题是在你的onActivityResult()方法,在这里你拨打:

Intent intent = getIntent(); 

getIntent()返回用于创建活动的意图。你想用传递到onActivityResult()方法的意图,所以:

mNewItem = data.getParcelableExtra(AddItemActivity.ADD_ITEM); 
+1

谢谢@ trevor-e!这就是诀窍!也有道理。我感谢您的帮助! – Wilson

+0

@威尔逊不客气。如果您可以请将此答案标记为已接受。 –