【问题标题】:return null Parcelable object返回 null Parcelable 对象
【发布时间】:2016-01-31 05:00:50
【问题描述】:

我写了一本书类扩展 Parcelable 是这样的:

public class Book implements Parcelable{

public String title;
public Author[] authors;
public String isbn;
public String price;

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

public Book(Parcel in)
{

    this.authors = (Author[]) in.readParcelableArray(Author.class.getClassLoader());
    this.title = in.readString();
    this.isbn = in.readString();
    this.price = in.readString();
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelableArray(authors, flags);
    dest.writeString(title);
    dest.writeString(isbn);
    dest.writeString(price);
}

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

并使用 startActivityForResult 启动另一个活动来添加书籍:

公共类 AddBookActivity 扩展 Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_book);

    Button add_btn = (Button) findViewById(R.id.add_one);
    add_btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent intent = getIntent();
            EditText titleView = (EditText) findViewById(R.id.search_title);
            EditText authorView = (EditText) findViewById(R.id.search_author);
            EditText isbnView = (EditText) findViewById(R.id.search_isbn);
            EditText priceView = (EditText) findViewById(R.id.search_price);

            String author_str = authorView.getText().toString();
            String[] split_str = author_str.split("\\s+");
            Author[] authors = new Author[1];
            if (split_str.length == 2) {
                authors[0] = new Author(split_str[0], split_str[1]);
            }
            if (split_str.length == 3) {
                authors[0] = new Author(split_str[0], split_str[1], split_str[2]);
            }

            String title = titleView.getText().toString();
            String isbn = isbnView.getText().toString();
            String price = priceView.getText().toString();

            intent.putExtra("book", new Book(title, authors, isbn, price));

            finish();
        }
    });

    Button cancel_btn = (Button) findViewById(R.id.cancel);
    cancel_btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            finish();
        }
    });}

但是,当我使用 getParclabe 方法获取 Book 对象时:

公共类 BookStoreActivity 扩展 ListActivity {

private static final String TAG = BookStoreActivity.class.getCanonicalName();

static final private int ADD_REQUEST = 1;
private ArrayList<Book> shoppingCart = new ArrayList<Book>();
ViewHolderAdapter viewHolderAdapter;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (shoppingCart.isEmpty())
         getListView().setEmptyView(findViewById(android.R.id.empty));
    else
         setListAdapter(new ViewHolderAdapter(this, R.layout.cart_row, shoppingCart));

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.bookstore_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    switch (item.getItemId())
    {
        case R.id.add:
            Intent intent = new Intent(this, AddBookActivity.class);
            startActivityForResult(intent, ADD_REQUEST);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if(requestCode == ADD_REQUEST) {
        if (resultCode == RESULT_OK) {
            Log.d(TAG, "*************************************");
            Bundle data = getIntent().getExtras();
            Book book = (Book) data.getParcelable("book");

            shoppingCart.add(book);

            viewHolderAdapter.notifyDataSetChanged();
        }
    }

}

static class ViewHolder {
    TextView title;
    TextView authors;
}

public class ViewHolderAdapter extends ArrayAdapter<Book>
{
    Context context;
    int layoutResourceId;
    ArrayList<Book> books;

    public ViewHolderAdapter(Context context, int layoutResourceId, ArrayList<Book> books) {
        super(context, layoutResourceId, books);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.books = books;
    }


    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
        if (convertView == null)
        {
            LayoutInflater inflater = getLayoutInflater();
            convertView =inflater.inflate(R.layout.cart_row, parent, false);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.cart_row_title);
            holder.authors = (TextView) convertView.findViewById(R.id.cart_row_author);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        Book book= books.get(position);

        holder.title.setText(book.getTitle());
        Author[] authors = book.getAuthors();
        String authors_str = "";
        for(int i = 0; i < authors.length; i++)
        {
            authors_str += authors[i].firstName + " "
                    + authors[i].middleInitial + " "
                    + authors[i].lastName + " ";
        }
        holder.authors.setText(authors_str);

        return convertView;
    }
}}

有一个错误:

Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference

提前致谢;

【问题讨论】:

    标签: android parcelable


    【解决方案1】:

    你忘记调用setResult()方法了。

    打电话

    setResult(Activity.RESULT_OK, intent);
    

    add_btn onClick 方法中的finish() 之前。

    更新

    在获取结果时,您需要使用方法参数中的意图对象。

    改变

    Bundle data = getIntent().getExtras();
    

    Bundle data = intent.getExtras();
    

    onActivityResult() 方法中。

    【讨论】:

    • 我加了,现在resultInfo的数据不为空了。但错误仍然是:尝试在空对象引用上调用虚拟方法 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)'
    • @sydridgm:你能把代码块贴在你试图获取这些数据的地方吗?
    • 我已经发布了。你现在可以看到它了
    • 是的,它现在可以工作了。但是又出现了一个问题:android.os.Parcelable[] cannot be cast to edu.stevens.cs522.bookstore.entities.Author[]
    • 这可能会对您有所帮助。 stackoverflow.com/questions/10071502/… 查看已接受的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2015-10-05
    相关资源
    最近更新 更多