【问题标题】:android.os.Parcelable[] cannot be cast to... Errorandroid.os.Parcelable[] 无法转换为... 错误
【发布时间】:2016-01-31 00:38:32
【问题描述】:

我正在为我的班级做一个项目,但我遇到了问题。添加书籍时出现以下错误有一个可打包的作者类,它将是一个数组和一个可打包的书籍类。作者被存储在书parcelable中:

错误:

java.lang.RuntimeException: Failure delivering result ResultInfo
{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity
{edu.stevens.cs522.bookstore/edu.stevens.cs522.bookstore.activities.BookStoreActivity}: 
java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to 
edu.stevens.cs522.bookstore.entities.Author[] 
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)

代码 作者:

package edu.stevens.cs522.bookstore.entities;

import android.os.Parcel;
import android.os.Parcelable;

public class Author implements Parcelable {

public String firstName = null;

public String middleInitial = null;

public String lastName = null;

public Author(String[] authorName) {
    if (authorName.length == 1) {
        this.lastName = authorName[0];
    } else if (authorName.length == 2) {
        this.firstName = authorName[0];
        this.lastName = authorName[1];
    } else if (authorName.length >= 3) {
        this.firstName = authorName[0];
        this.middleInitial = authorName[1];
        this.lastName = authorName[2];
    } else if (authorName.length == 0) {
        //nothing needs to be done
    }
}

public Author(String firstName, String middleInitial, String lastName) {
    this.firstName = firstName;
    this.middleInitial = middleInitial;
    this.lastName = lastName;
}

public Author(Parcel in) {
    String[] data = new String[3];

    in.readStringArray(data);
    this.firstName = data[0];
    this.middleInitial = data[1];
    this.lastName = data[2];
}

public static final Parcelable.Creator<Author> CREATOR = new Parcelable.Creator<Author>() {
    public Author createFromParcel(Parcel in) {
        return new Author(in);
    }

    public Author[] newArray(int size) {
        return new Author[size];
    }
};

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    String[] array = new String[3];
    array[0] = this.firstName;
    array[1] = this.middleInitial;
    array[2] = this.lastName;
    dest.writeStringArray(array);
}
}

密码本:

package edu.stevens.cs522.bookstore.entities;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {

// TODO Modify this to implement the Parcelable interface.

// TODO redefine toString() to display book title and price (why?).

public int id;

public String title;

public String isbn;

public String price;

public Author[] authors;

public Book(int id, String title, Author[] author, String isbn, String price) {
    this.id = id;
    this.title = title;
    this.authors = new Author[author.length];
    for (int i = 0; i < author.length; i++) {
        authors[i] = author[i];
    }
    this.isbn = isbn;
    this.price = price;
}

public Book(Parcel in) {
    int intdata = in.readInt();
    this.id = intdata;

    String[] data = new String[3];
    in.readStringArray(data);
    this.title = data[0];
    this.isbn = data[1];
    this.price = data[2];

    Author[] authorsT = (Author[]) in.readParcelableArray(Author.class.getClassLoader());
    this.authors = new Author[authorsT.length];
    for (int i = 0; i < authorsT.length; i++) {
        authors[i] = authorsT[i];
    }
}

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

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    String[] data = new String[3];
    data[0] = title;
    data[1] = isbn;
    data[2] = price;
    dest.writeStringArray(data);
    if (authors == null) {
        authors = new Author[1];
    }
    dest.writeParcelableArray(authors, flags);

}

@Override
public String toString() {
    return isbn;

}
}

书籍和作者对象的创建位置:

public Book searchBook() {
    /*
     * Search for the specified book.
     */

    // TODO Just build a Book object with the search criteria and return that.
    EditText editAuthor = (EditText) findViewById(R.id.search_author);
    String authorString = editAuthor.getText().toString();
    String[] authors = authorString.split(", ");
    Author[] authorsArray = new Author[authors.length];
    for (int i = 0; i < authors.length; i++) {
        authorsArray[i] = new Author(authors[i].split(" "));
    }
    EditText editTitle = (EditText) findViewById(R.id.search_title);
    EditText editIsbn = (EditText) findViewById(R.id.search_isbn);
    String title = editTitle.getText().toString();
    String isbn = editIsbn.getText().toString();

    Log.e(title, authorsArray[0].lastName);
    Log.e("isbn:", isbn);

    Book newBook = new Book(100, title, authorsArray, isbn, "10");
    return newBook;
}

如何调用意图:

Book resultBook = searchBook();
Intent result = new Intent();
result.putExtra(BOOK_RESULT_KEY, resultBook);
setResult(RESULT_OK, result);
finish();

以及我的 onActivityResult 中的代码:

if(requestCode == ADD_REQUEST) {
      Bundle  data = intent.getExtras();
        Book book = (Book)data.getParcelable(AddBookActivity.BOOK_RESULT_KEY);
        Log.e ("BOOK_TITLE", book.title);
    }

谁能帮我弄清楚我做错了什么才得到这个错误?

 java.lang.RuntimeException: Failure delivering result ResultInfo
{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity
{edu.stevens.cs522.bookstore/edu.stevens.cs522.bookstore.activities.BookStoreActivity}: 
java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to 
edu.stevens.cs522.bookstore.entities.Author[] 
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)

【问题讨论】:

    标签: android android-activity parcelable


    【解决方案1】:

    在您的 Book 类中进行这些更改,以将 xxxParcelableArray() 方法替换为 xxxTypedArray() 方法:

        Author[] authorsT = in.createTypedArray(Author.CREATOR);
        //Author[] authorsT = (Author[]) in.readParcelableArray(Author.class.getClassLoader());
    
    
        dest.writeTypedArray(authors, flags);
       //dest.writeParcelableArray(authors, flags);
    

    更改原因在this question的回复中说明。

    【讨论】:

    • 祝你上课顺利。我很好奇,在网上找到了 CS 522 的教学大纲。无法想象如何在 14 周内学会所有这些材料!
    • 谢谢!这个任务只是我们的第二个任务!!我们的第一个不仅仅是一个你好世界。它把你在一个活动中输入的内容显示在第二个活动中。我认为第二个任务太复杂了。我的意思是很多其他学生对 Android 的经验为零,我有一些但还没有做过类似的事情
    猜你喜欢
    • 2014-07-10
    • 2016-05-01
    • 2019-12-31
    • 2022-01-20
    • 2014-02-03
    • 2021-08-21
    • 2021-11-18
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多