Android:Parcelable什么都不返回

时间:2015-11-17 23:49:25

标签: java android nullpointerexception parcelable

我有以下问题:我想将一个对象从一个活动包裹到另一个活动。

是这个对象:

public class Item implements Parcelable {

private int minimumAmountOfItems;
private String nameOfItem;
private int maximumAmountOfItems;
private int actualAmountOfItems;

public Item(int minimumAmountOfItems, String nameOfItem, int     maximumAmountOfItems, int actualAmountOfItems){
    this.minimumAmountOfItems = minimumAmountOfItems;
    this.nameOfItem = nameOfItem;
    this.maximumAmountOfItems = maximumAmountOfItems;
    this.actualAmountOfItems = actualAmountOfItems;
}

使用以下可分配的编码内容:

 @Override
public int describeContents() {
    /*Necessary for the parcelable stuff; but not needed in about 99.9% of the cases (source: Stack Overflow)*/
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    /*Store the data in a parcelable object to communicate between Activities */
    dest.writeInt(this.minimumAmountOfItems);
    dest.writeString(this.nameOfItem);
    dest.writeInt(this.maximumAmountOfItems);
    dest.writeInt(this.actualAmountOfItems);

}

private Item(Parcel in){

    /*Retrieve the data that was packaged before*/

    this.minimumAmountOfItems = in.readInt();
    this.nameOfItem = in.readString();
    this.maximumAmountOfItems = in.readInt();
    this.actualAmountOfItems = in.readInt();
}

public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>(){
    /*This small part of code passes along the unmarshalled parcel and returns the next object.*/
    @Override
    public Item createFromParcel(Parcel in){
        return new Item(in);
    }

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

因此,我在我的活动中使用以下代码来包裹我的对象:

resultIntent = new Intent(ItemCreatorActivity.this, ItemListEditorActivity.class);
resultIntent.putExtra("Item", item);
startActivity(resultIntent);

为了得到我想要实现的一切:

Intent inputIntent = getIntent();
   Item passedItem = inputIntent.getExtras().getParcelable("Item");
System.out.println(passedItem.getNameOfItem());

现在我有几个问题:

1。)我如何检查,我是否从发件人到收件人获得有效的可分配信息? 我认为我已经从本教程中获得了关于可分配对象的所有重要内容:https://coderwall.com/p/vfbing/passing-objects-between-activities-in-android其他几个(由于可读性目的,我不会在这里发布它们,因为它们都描述了相同的过程和结构......) ;但仍然我的System.out.println(passedItem.getNameOfItem())不会抛出任何东西。我的AndroidMonitor中没有其他消息。

2.)当我没有创建Item对象时,我正在调用此活动一次。是否有更多&#34;光滑&#34;第一次调用活动时,在此代码中阻止nullpointerexception的方法是什么?

3。)当我按下一个按钮,切换到一个新的Activity,创建一个Item对象并想象一下,我的代码之前会有效,我可以将我的对象传递回调用Activity。我之前在调用Activity的ArrayList中保存的所有对象是否仍然可用,或者我是否必须将我的ArrayList传递给新的Activity然后返回到调用Activity?

提前感谢您的帮助。

祝你好运

2 个答案:

答案 0 :(得分:1)

您正在意图中添加parcelable对象并从Bundle中检索它(inputIntent.getExtras()返回Bundle类型的对象)。

所以你需要把它改成inputIntent.getParcelableExtra(“Item”);

3。)当我按下一个按钮,切换到一个新的Activity,创建一个Item对象并想象一下,我的代码之前会有效,我可以将我的对象传递回调用Activity。我之前在调用Activity的ArrayList中保存的所有对象是否仍然可用,或者我是否必须将我的ArrayList传递给新的Activity然后返回到调用Activity?

是。您可以将ArrayList添加到intent对象:

ArrayList<Item> itemList = new ArrayList<Item>();
// Add elements to the list
intent.putParcelableArrayListExtra("Item_List", itemList);

并检索它:

ArrayList<Item> itemList = inputIntent.getParcelableArrayListExtra("Item_List");

答案 1 :(得分:1)

  

1。)我如何检查,我是否从发件人到收件人获得有效的可分配信息?我认为我已经从本教程中获得了关于可分配对象的所有重要内容:https://coderwall.com/p/vfbing/passing-objects-between-activities-in-android其他几个(由于可读性目的,我不会在这里发布它们,因为它们都描述了相同的过程和结构......) ;但仍然我的System.out.println(passedItem.getNameOfItem())不会抛出任何东西。我的AndroidMonitor中没有其他消息。

您可以通过

登录logcat
Log.d("tag", passedItem.getNameOfItem()); 

并查看您的logcat。它应该打印出你的数据

  

2.)当我没有创建Item对象时,我正在调用此活动一次。是否有更多&#34;光滑&#34;第一次调用活动时,在此代码中阻止nullpointerexception的方法?

您可以在接收活动中执行此操作:

Bundle extras = getIntent().getExtras();
if (extras != null) {
   Item passedItem = (Item) extras.getParcelable("Item"); 
}
  

3。)当我按下一个按钮,切换到一个新的Activity,创建一个Item对象并想象一下,我的代码之前会有效,我可以将我的对象传递回调用Activity。我之前在调用Activity的ArrayList中保存的所有对象是否仍然可用,或者我是否必须将我的ArrayList传递给新的Activity然后返回到调用Activity?

至于此,我会研究http://developer.android.com/training/basics/activity-lifecycle/recreating.html,它将教你如何重建活动并通过各州保存数据。