返回父活动的Parcelable类为null

时间:2016-01-31 19:49:23

标签: android android-intent null parcelable

对于我在教程中学习android开发时正在制作的这个书店应用程序。我一直在努力解决这个问题6个小时。出于某种原因,当我在子Activity上设置setResult时,当我检查Book Parcelable类的toString时,它会打印出logcat中的预期内容。我通过在onActivityforResult中执行此操作来启动父项中的Activity for Result:

            Intent addIntent = new Intent(this, AddBookActivity.class);
            startActivityForResult(addIntent, ADD_REQUEST);

然后通过执行

发送Parcelable类Book(在子活动中完成)
            Intent returnIntent = new Intent();
            returnIntent.putExtra(BOOK_RESULT_KEY, newBook);
            setResult(RESULT_OK, returnIntent);
            Log.i("intent get", returnIntent.getParcelableExtra(BOOK_RESULT_KEY).toString());
            finish();

在这种情况下,toString()会在应用程序中正确输入时返回书籍的标题和价格。这就是我在父活动中检索意图的方式:

if(requestCode == ADD_REQUEST){
        if(resultCode == RESULT_OK) {
            Book newBook = intent.getParcelableExtra(AddBookActivity.BOOK_RESULT_KEY);
            Log.i("book", newBook.toString());
            shoppingCart.add(newBook);

然而,它总是打印出“null null”而不是“TITLE_OF_BOOK PRICE_OF_BOOK”。 stackOverflow上的许多帖子描述了类似的问题,但没有任何效果。我也尝试在发送和接收意图时使用bundle。

我很确定我的Book类已正确实现了parcelable,但这里仅供参考。作者也是一个可以参加的课程。

public class Book implements Parcelable{
int id;

public String title;

public Author[] authors;

public String isbn;

public String price;

public Book(int id, String title, Author[] author, String isbn, String price) {
    this.id = id;
    this.title = title;
    this.authors = author;
    this.isbn = isbn;
    this.price = price;
}

private Book(Parcel in){
    this.id = in.readInt();
    this.authors = in.createTypedArray(Author.CREATOR);
    this.title = in.readString();
    this.isbn = in.readString();
    this.price = in.readString();
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(title);
    dest.writeTypedArray(authors, 0);
    dest.writeString(isbn);
    dest.writeString(price);
}

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

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

@Override
public int describeContents() {
    return 0;
}

@Override
 public String toString() {
    return title + " " + price;
}
}

我真的不确定为什么它总是显示为null,发送意图和使用parcelables的整个想法似乎很容易理解。

编辑:添加Log.i(“book”,newBook.title)时,会出现此错误:

Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {...BookStoreActivity}: java.lang.NullPointerException:println needs a message

然后错误指向该日志行。

似乎Book的所有属性在收到时都被设置为null,但在发送时却没有。

1 个答案:

答案 0 :(得分:0)

您的图书对象无法重建,因为您正以不同于您编写的顺序从包裹中读取值。

在你的writeToParcel()方法中,你写的是第二名,第三名是作者。然而,在你的parcel构造函数中,你是第二个读者,第三个是第三个。您需要按照编写顺序从包中读取值。

尝试一下,让我知道它是怎么回事。