Erro do AndroidRuntime: Parcela: impossível empacotar o valor

109

Estou tentando passar um HashMap para uma nova atividade usando a função intent.puExtra. Percorrendo o depurador, parece que ele adiciona o HashMap sem problemas, no entanto, quando startActivty () é chamado, recebo um erro de tempo de execução informando que Parcel: não foi possível empacotar o valor com.appName.Liquor.

Liquor é uma classe personalizada que criei e acredito que, em combinação com um HashMap, está causando o problema. Se eu passar uma string em vez do meu HashMap, ele carrega a próxima atividade sem problemas.

Atividade principal

lv.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {

      String cat = ((TextView) view).getText().toString();
      Intent i = new Intent(OhioLiquor.this, Category.class);
      i.putExtra("com.appName.cat", _liquorBase.GetMap());
      startActivity(i);

Classe de licor

public class Liquor
{
public String name;
public int code;
public String category;

private HashMap<String, Bottle> _bottles;

public Liquor()
{
    _bottles = new HashMap<String, Bottle>();
}

public void AddBottle(Bottle aBottle)
{
    _bottles.put(aBottle.size, aBottle);
}
}

Subatividade

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

    HashMap<Integer, Liquor> map = (HashMap<Integer, Liquor>)getIntent().getSerializableExtra("com.appName.cat");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, GetNames(map)));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

Quando o erro de tempo de execução existe, ele nunca chega à classe de subatividade. Portanto, tenho quase certeza de que o problema existe na adição do HashMap ao intent e, com base no erro, acredito que minha classe Liquor é a causa, mas não consigo descobrir por quê.

Sua ajuda será muito apreciada. Obrigado!

Jared
fonte

Respostas:

274

O seu HashMappróprio é serializável, mas a Bottleclasse é serializável? Caso contrário, ele não será serializado e gerará erros no tempo de execução. Faça a Bottleclasse implementar a java.io.Serializableinterface

Naikus
fonte
5
Obrigado, tive que adicionar implementos Serializable para as classes Liquor e Bottle.
Jared
2
ele funciona .. Eu tenho que implementar Serializable na classe Bottle. Obrigado @naikus
Ashokchakravarthi Nagarajan
177
O licor é sempre o culpado :))
Cezar Alexandru Vancea
3
Trabalhou para mim :)
Jacky
1
Funciona, mas estou confuso sobre o que serialização tem a ver com isso? O Android continua serializando e desserializando objetos periodicamente? E em que casos eu preciso implementar a interface serializável (como aqui)?
Reeshabh Ranjan