Android: Pasar un mapa hash entre las actividades

Tengo un mapa entre la cadena y un objeto de clase. Relleno este mapa en Activity1 y me gustaría pasarlo a activity2.

public class NEW extends Activity { public class data { String name; float value; .... etc } ...... static Map<String, data> data_map = new HashMap<String, data>(); ..... } 

Estoy asumiendo que usted posee ambas actividades (llámelos A y B). En cuyo caso basta con poner el mapa en una variable pública estática y acceder a ella desde B a través de A.data_map.

[actualizar]

Para todos los downvotes echar un vistazo a la sección FAQ de la aplicación Android Framework "¿Cómo puedo pasar datos entre Actividades / Servicios dentro de una sola aplicación?". La solución que recomiendo es exactamente la misma que …

Un campo / método estático público

Una forma alternativa de hacer accesibles los datos a través de Actividades / Servicios es usar campos y / o métodos estáticos públicos . Puede acceder a estos campos estáticos desde cualquier otra clase en su aplicación. Para compartir un objeto, la actividad que crea su objeto establece un campo estático para apuntar a este objeto y cualquier otra actividad que desee usar este objeto sólo accede a este campo estático.

Sí, hay advertencias a esta solución, pero con la información limitada presentada por el OP no podemos asumir que este método no funcionará.

La mejor manera de hacerlo es si puede expresar sus datos en las primitivas compatibles con Bundle, por lo que se puede colocar en el Intent que está enviando a través de los métodos Intent.putExtra (). (EXCEPTO para el uso de Serializable, que es extremadamente lento e ineficiente.)

Sin embargo, no puede hacerlo porque (a) está utilizando un mapa y (b) su mapa contiene un tipo de datos personalizado.

La solución formalmente correcta para este problema exacto es escribir una clase personalizada de Parcellable que se encarga de ordenar / desenmascarar su estructura de datos. Voy a bosquejar el código aquí, aunque puede no ser exactamente correcto:

 import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable.Creator; public class MyData implements Parcelable { HashMap<String, data> data_map = new HashMap<String, data>(); public MyData() { } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int parcelableFlags) { final int N = data_map.size(); dest.writeInt(N); if (N > 0) { for (Map.Entry<String, data> entry : data_map.entrySet()) { dest.writeString(entry.getKey()); data dat = entry.getValue(); dest.writeString(dat.name); dest.writeFloat(dat.value); // etc... } } } public static final Creator<MyData> CREATOR = new Creator<MyData>() { public MyData createFromParcel(Parcel source) { return new MyData(source); } public MyData[] newArray(int size) { return new MyData[size]; } }; private MyData(Parcel source) { final int N = source.readInt(); for (int i=0; i<N; i++) { String key = source.readString(); data dat = new data(); dat.name = source.readString(); dat.value = source.readFloat(); // etc... data_map.put(key, dat); } } } 

Tenga en cuenta que cuando usted tiene una estructura de datos personalizada como su clase "data", puede ser más limpio también hacer que Parcellable, por lo que sabe cómo leer / escribir su contenido en un paquete, y el código aquí solo llamaría .writeToParcel …) y un método .readFromParcel (…) en lugar de conocer los detalles de su contenido. De esta manera, cuando agregue nuevos campos a "datos", no olvide también actualizar este otro código de distribución para conocerlos.

Yo sugeriría usar Intents, que funcionan tanto para objetos estáticos como arbitrarios (siempre y cuando implementen Serializable). Cree una intención personalizada para su aplicación y luego pase su HashMap (no un mapa, que no implementa Serializable!) Como datos adicionales:

 Intent act2 = new Intent(Activity2.SHOW_ME); act2.putExtra("data", data_map); 

A continuación, en Actividad2, puede llamar a getIntent() y comprobar a través de Intent.getAction().equals(Activity2.SHOW_ME) si fue el que llamó a su Actividad. Si es así, puede acceder a sus datos adicionales

 Intent caller = getIntent(); if (caller.getAction().equals(Activity2.SHOW_ME)) { Map<String, NEW.data> data_map = (Map<String, NEW.data>)caller.getExtras().get("data"); } 

Espero que escribí todo correctamente;) Esto supone que su Intención cadena de acción se almacena como static final string SHOW_ME = "yourpackage.yourname"; En Actividad2.

Si necesita más aclaraciones, añada un comentario.

Puede encapsular sus datos en un Servicio enlazado como se describe en este documento:

http://developer.android.com/guide/topics/fundamentals/bound-services.html

No olvide agregar su servidor al archivo de manifiesto.

Esta solución tiene la ventaja de desacoplar sus datos de su interfaz de usuario, que finalmente conducirá a un diseño más mantenible.

Si surge la necesidad, puede agregar un contenedor de mensajería a la API de su servicio para permitir que se llame desde otros procesos / aplicaciones

Cree un nuevo archivo java que será global para toda la aplicación.

Paso 1 :

 public class GlobalClass extends android.app.Application { public static Map<String, NEW.data> data_map = new Map<String, NEW.data>(); } 

Paso 2 :

Después de hacer eso, registre esta "GlobalClass" en AndroidManifest.xml

 <application android:name=".GlobalClass" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > </application> 

Paso 3 :

Ahora puede utilizar este mapa en cualquier parte de su aplicación.

 @Override protected void onCreate(Bundle icicle) { GlobalClass global = (GlobalClass)getApplication(); Map<String, NEW.data> my_map_data = global.data_map; } 

Estos pasos pueden ser útiles para usted …

  • Android: Google Map no muestra
  • No se puede importar com.google.android.maps.MapActivity
  • Cómo descargar osmdroid azulejos en el usuario final?
  • Inserción de valores en Mapa <K, V>
  • Quiero crear una aplicación para Android con un mapa que proporcione direcciones, pero no Google Maps
  • Extraño problema MapView; Error de PixelConverter
  • Combo de IdentityHashMap y WeakHashMap
  • Obtención de 0.0 para latitud y longitud mientras muestra la ubicación actual en el mapa
  • Mapa de calle abierto AND android app
  • Obtener las líneas de GL10 dibujo de imágenes junto a la otra, la solución?
  • Android - Bitmap y gestión de la memoria?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.