return null Parcelable对象

时间:2016-01-30 19:48:15

标签: android parcelable

我写了一个类扩展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启动另一个活动来添加book:

公共类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

提前感谢;

1 个答案:

答案 0 :(得分:0)

您忘了拨打setResult()方法。

致电

setResult(Activity.RESULT_OK, intent);
finish() add_btn方法{。}}之前

<强>更新

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

更改

onClick

Bundle data = getIntent().getExtras();

Bundle data = intent.getExtras(); 方法中。