对于我在教程中学习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,但在发送时却没有。
答案 0 :(得分:0)
您的图书对象无法重建,因为您正以不同于您编写的顺序从包裹中读取值。
在你的writeToParcel()
方法中,你写的是第二名,第三名是作者。然而,在你的parcel构造函数中,你是第二个读者,第三个是第三个。您需要按照编写顺序从包中读取值。
尝试一下,让我知道它是怎么回事。