Pregunta ¿Cómo enviar un objeto de una actividad de Android a otra usando Intents?


¿Cómo puedo pasar un objeto de un tipo personalizado de uno Actividad a otro usando el putExtra() método de la clase Intención?


743


origen


Respuestas:


Si solo estás pasando objetos alrededor Parcelable fue diseñado para esto. Requiere un poco más de esfuerzo que utilizar la serialización nativa de Java, pero es mucho más rápido (y me refiero a la forma, CAMINO Más rápido).

De los documentos, un ejemplo simple de cómo implementar es:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

Observe que en el caso de que tenga más de un campo para recuperar de una Parcela determinada, debe hacerlo en el mismo orden en que los ingresó (es decir, en un enfoque FIFO).

Una vez que tenga sus objetos implementar Parcelable solo es cuestión de ponerlos en su Intentos con putExtra ():

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

Entonces puedes sacarlos de nuevo con getParcelableExtra ():

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

Si su Clase de objetos implementa Parcelable y Serializable, asegúrese de realizar una de las siguientes acciones:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

683



Tendrá que serializar su objeto en algún tipo de representación de cadena. Una posible representación de cadenas es JSON, y una de las maneras más fáciles de serializar a / desde JSON en Android, si me preguntas, es a través de Google GSON.

En ese caso, juse puso el valor de retorno de la cadena de (new Gson()).toJson(myObject); y recuperar el valor de la cadena y el uso fromJson para volver a convertirlo en tu objeto

Sin embargo, si su objeto no es muy complejo, puede que no valga la pena la sobrecarga, y podría considerar pasar los valores separados del objeto en su lugar.


160



Puede enviar objetos serializables mediante intento

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 

142



Para situaciones en las que sabe que va a pasar datos dentro de una aplicación, use "globales" (como clases estáticas)

aquí qué es Dianne Hackborn (Hackbod - un Ingeniero de Software Android de Google) tenía que decir al respecto:

Para situaciones en las que sabe que las actividades se ejecutan en el mismo   proceso, puede simplemente compartir datos a través de globales. Por ejemplo tu   podría tener un global HashMap<String, WeakReference<MyInterpreterState>>   y cuando haces que un nuevo MyInterpreterState aparezca con un nombre único   para ello y ponerlo en el mapa hash; para enviar ese estado a otro   actividad, simplemente ponga el nombre único en el mapa hash y cuando el   segunda actividad iniciada, puede recuperar MyInterpreterState de   el mapa hash con el nombre que recibe.


63



Tu clase debe implementar Serializable o Parcelable.

public class MY_CLASS implements Serializable

Una vez hecho esto, puede enviar un objeto en putExtra

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Para obtener extras solo tienes que hacer

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

Si su clase implementa el uso Parcelable siguiente

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

Espero que ayude: D


46



si su clase de objeto implementa Serializable, no necesita hacer nada más, puede pasar un objeto serializable.
 eso es lo que uso


27



Respuesta corta para una necesidad rápida

1. Implemente su Clase en Serializable. 

¡Si tienes Clases internas, no olvides implementarlas en Serializable también!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Pon tu objeto a prueba 

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3. Y recibe tu objeto en la otra clase de actividad

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

24



Puedes usar el BUNDLE de Android para hacer esto.

Crea un paquete de tu clase como:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}

Luego pasa este paquete con INTENCION. Ahora puedes recrear tu objeto de clase pasando paquete como

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}

Declare esto en su clase personalizada y use.


16