2016-01-30 4 views
1

Я пишу класс книга расширяет 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 начиная другую деятельность, чтобы добавить книгу:

общественный класс AddBookActivity расширяет активность {

@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 для получения Книга объект:

общественного класса 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 

спасибо заранее;

ответ

0

Вы забыли позвонить по телефону setResult() метод.

Вызов

setResult(Activity.RESULT_OK, intent); 

перед тем finish() в add_btnonClick методом.

Update

При получении результата вы должны использовать пристальный объект из параметра метода.

Изменить

Bundle data = getIntent().getExtras(); 

в

Bundle data = intent.getExtras(); 

в onActivityResult() методом.

+0

Я добавляю его, и данные resultInfo теперь не являются нулевыми. но ошибка по-прежнему: попытка вызвать виртуальный метод «android.os.Parcelable android.os.Bundle.getParcelable (java.lang.String)» на нулевой ссылке на объект – sydridgm

+0

@sydridgm: можете ли вы разместить блок кода, где вы находитесь пытаясь получить эти данные? – Rohit5k2

+0

Я опубликовал его. вы могли видеть это сейчас – sydridgm

Смежные вопросы