¿Es posible crear un HashMap que sea Parcelable en Android?

Estoy tratando de extender HashMap como un Parcelable y tengo la sintaxis para compilar, sin embargo, en tiempo de ejecución que lanza una excepción y devuelve un puntero nulo tratando de desmarcar los datos.

El emisor tiene que emitir a (Parcelable) para resolver la ambigüedad, sin embargo, el receptor se queja de que se espera Parcelable, pero encontró HashMap.

¿Alguien ha tenido éxito con esto? ¿Es incorrecta mi sintaxis? ¿Hay una solución mejor?

El siguiente es el código:

  • HomeActivity.java – el remitente
  • ContentViewActivity.java – el receptor
  • ContentItemSimple.java – como su nombre implica (envuelve una cadena y entero)
  • ContentItemCollection.java – este es el HashMap

HomeActivity.java

package com.mobibob.android.studyparceable; import java.util.HashMap; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.text.format.Time; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class HomeActivity extends Activity implements OnClickListener { private static final String TAG = "HomeActivity"; private ContentItemSimple mContentItemSimple = null; private ContentItemContainer mContentItemContainer = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); Button click = (Button) findViewById(R.id.button_clickit); click.setOnClickListener(this); mContentItemSimple = new ContentItemSimple(); mContentItemSimple.name = "mobibob"; mContentItemSimple.year = 2010; String value = "value"; Time nowTime = new Time(); nowTime.setToNow(); mContentItemContainer = new ContentItemContainer(); mContentItemContainer.put("string", new String("baseball is great!")); mContentItemContainer.put("integer", new Integer(1234)); // mContentItemContainer.put("boolean", new Boolean(true)); // mContentItemContainer.put("date", nowTime); // mContentItemContainer.put("parcel", new Bundle()); Log.d(TAG, "..... " + mContentItemContainer.toString()); } @Override public void onClick(View v) { Intent i = new Intent(getBaseContext(), ContentViewActivity.class); i.putExtra(ContentItemSimple.EXTRA_CONTENT_DETAIL, mContentItemSimple); i.putExtra(ContentItemContainer.EXTRA_CONTENT_CONTAINER, (Parcelable) mContentItemContainer); startActivityForResult(i, 0); } } 

ContentViewActivity

 package com.mobibob.android.studyparceable; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.mobibob.android.studyparceable.ContentItemSimple; public class ContentViewActivity extends Activity implements OnClickListener { private static final String TAG = "ContentViewActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_view); Button gohome = (Button) findViewById(R.id.button_gohome); gohome.setOnClickListener(this); ContentItemSimple ci = null; ContentItemContainer cx = null; try { ci = getIntent().getParcelableExtra(ContentItemSimple.EXTRA_CONTENT_DETAIL); Log.i(TAG, "ci = " + ci.toString()); cx = getIntent().getParcelableExtra(ContentItemContainer.EXTRA_CONTENT_CONTAINER); Log.i(TAG, "cx = " + cx.toString()); TextView tvName = (TextView) findViewById(R.id.ci_name); tvName.setText(ci.name); TextView tvYear = (TextView) findViewById(R.id.ci_year); tvYear.setText(String.format("%d", ci.year)); } catch (Exception e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } @Override public void onClick(View v) { finish(); } } 

ContentItemSimple.java

 package com.mobibob.android.studyparceable; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; public class ContentItemSimple implements Parcelable { public static final String TAG = "ContentItem"; public static final String EXTRA_CONTENT_DETAIL = "contentDetail"; public String name = "name"; public Integer year = Integer.MIN_VALUE; ContentItemSimple() { name = new String(""); year = new Integer(Integer.MIN_VALUE); } ContentItemSimple(Parcel in) { try { name = in.readString(); year = in.readInt(); } catch (Exception e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } @Override public String toString() { return String.format("name=%s age=%d", name, year); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(year); } public static final Parcelable.Creator<ContentItemSimple> CREATOR = new Parcelable.Creator<ContentItemSimple>() { public ContentItemSimple createFromParcel(Parcel in) { return new ContentItemSimple(in); } public ContentItemSimple[] newArray(int size) { return new ContentItemSimple[size]; } }; } 

ContentItemContainer.java

 package com.mobibob.android.studyparceable; import java.util.HashMap; import java.util.Iterator; import android.os.Parcel; import android.os.Parcelable; public class ContentItemContainer extends HashMap<String, Object> implements Parcelable { /** * Container for wddx 'struct' elements. */ private static final long serialVersionUID = 1L; // public String name = "?"; // public String value = "?"; public static final String EXTRA_CONTENT_DETAIL = "contentDetail"; public static final String EXTRA_CONTENT_CONTAINER = "contentContainer"; public static final String EXTRA_CONTENTDETAIL_NAME = "name"; public static final String EXTRA_CONTENTDETAIL_VALUE = "value"; // private static HashMap<String, Object> map = new HashMap<String, Object>(); ContentItemContainer() { super(); } ContentItemContainer(Parcel in) { in.readMap(this, ContentItemContainer.class.getClassLoader()); } @Override public String toString() { StringBuilder sb = new StringBuilder(""); Integer x = 0; Iterator<HashMap.Entry<String, Object>> it = this.entrySet().iterator(); while (it.hasNext()) { HashMap.Entry<String, Object> pairs = (HashMap.Entry<String, Object>) it.next(); x++; sb.append("\n"+x.toString()+": ").append("name=").append(pairs.getKey()).append(" value=").append(pairs.getValue().toString()); } return sb.toString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeMap(this); } public static final Parcelable.Creator<ContentItemContainer> CREATOR = new Parcelable.Creator<ContentItemContainer>() { public ContentItemContainer createFromParcel(Parcel in) { return new ContentItemContainer(in); } public ContentItemContainer[] newArray(int size) { return new ContentItemContainer[size]; } }; } 

La forma en que su clase ContentItemContainer se implementa – como extender HashMap, su writeToParcel y Parcelable.Creator nunca será llamado.

La razón es que Map es un tipo de datos válido que se va a poner en un paquete, por lo que la clase se aplana utilizando la lógica de la clase HashMap y no la suya. Esto se debe a que la forma en que se implementa Parcel, comprueba si los valores suministrados son descendientes de ciertas clases en un orden específico.

Cuando unparcelling los extras, un HashMap se creará de los datos de su objeto en consecuencia.

Para evitar esto, podría ocultar el HashMap dentro de su clase y exponer getters / putters para el HashMap. Esto es exactamente la misma manera que se implementa ContentValues, y la parcelación / unparcelling funciona sin ningún problema.

  • Hacer una clase parcelable que contiene la lista de objetos personalizados
  • Errores de unmarshalling en la aplicación de Android con clases parcelables personalizadas
  • ClassNotFoundException cuando unmarshalling y realmente no sé por qué
  • ¿Cómo pasar el objeto Parcelable del niño a la actividad de los padres?
  • ¿Qué es una comunicación más rápida usando un mensajero o una intención?
  • Android: causas unparceling fuera de la excepción de memoria. ¿Cómo inspeccionar objetos?
  • ¿Cómo leer y escribir Enum en paquete en Android?
  • Casting objetos a subclases de una superclase Parcelable?
  • Persistencia de un objeto Parcelable en Android
  • Implementación parcelable con ArrayList <objeto personalizado>
  • Pase de ArrayList <? implementa Parcelable> a Actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.