Intención putExtra ArrayList <NameValuePair>
¿Alguien sabe cómo agregar un ArrayList<NameValuePair>
a un Intent como un extra?
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); /* Move on to step 2 */ Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class); intent.putExtra("nvp", nameValuePairs); startActivity(intent);
Aquí está la declaración de clase para RegisterActivity2:
- Abrir un fragmento de una actividad de otra actividad
- Al usar 'android.intent.action.SEND', la actividad receptora no regresa a la actividad que inició el recurso compartido
- Cómo puedo agregar la imagen en el cuerpo del email
- El tipo de archivo asociado con la aplicación android falla
- Pasar datos de un fragmento a otro
public class RegisterActivity2 extends Activity implements Serializable { }
El error en el logcat es:
> Parcel: unable to marshal value first_name="whatever"
Después de implementar la sugerencia de Ted Hopp, sigo recibiendo un error. Aquí está el rastreo de la pila:
08-04 22:10:16.095: E/AndroidRuntime(5065): FATAL EXCEPTION: main > 08-04 22:10:16.095: E/AndroidRuntime(5065): > java.lang.RuntimeException: Unable to start activity > ComponentInfo{/.RegisterActivity2}: java.lang.RuntimeException: > Parcelable encountered IOException reading a Serializable object (name > = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.access$600(ActivityThread.java:135) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Handler.dispatchMessage(Handler.java:99) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Looper.loop(Looper.java:137) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.app.ActivityThread.main(ActivityThread.java:4849) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > java.lang.reflect.Method.invokeNative(Native Method) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > java.lang.reflect.Method.invoke(Method.java:511) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > dalvik.system.NativeStart.main(Native Method) 08-04 22:10:16.095: > E/AndroidRuntime(5065): Caused by: java.lang.RuntimeException: > Parcelable encountered IOException reading a Serializable object (name > = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065): at android.os.Parcel.readSerializable(Parcel.java:2144) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readValue(Parcel.java:2016) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readListInternal(Parcel.java:2235) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readArrayList(Parcel.java:1655) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readValue(Parcel.java:1986) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readMapInternal(Parcel.java:2226) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Bundle.unparcel(Bundle.java:223) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Bundle.getSerializable(Bundle.java:1254) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.content.Intent.getSerializableExtra(Intent.java:4268) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > .RegisterActivity2.onCreate(RegisterActivity2.java:24) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.Activity.performCreate(Activity.java:5244) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034) > 08-04 22:10:16.095: E/AndroidRuntime(5065): ... 11 more 08-04 > 22:10:16.095: E/AndroidRuntime(5065): Caused by: > java.io.InvalidClassException: > org.apache.http.message.BasicNameValuePair; IllegalAccessException > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:694) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:655) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1816) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readSerializable(Parcel.java:2142) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): ... 23 more
- Depurar los intentos
- Abrir un archivo seleccionado (imagen, pdf, ...) de forma programática de mi aplicación de Android?
- Rjava.lang.IllegalArgumentException en startActivity (intención, animación de paquete)
- Pausar la reproducción de medios de forma fiable en todo el sistema en Android
- Recursos de Android $ NotFoundException
- Obtener Broadcast recibir cuando la tarjeta SD está desmontando android
- No se ha encontrado actividad para manejar Intención
- No hay extras en Activity.getIntent () cuando vuelve a él desde un niño Actividad
Como otros han señalado, cuando desea pasar un array como un intento extra, los elementos necesitan implementar Serializable
. En su caso, el enfoque es bastante simple (no bastante – vea más abajo): defina su propia subclase de BasicNameValuePair
y declare que implementa la interfaz.
public class NVP extends BasicNameValuePair implements Serializable { public NVP(String name, String value) { super(name, value); } }
Entonces puedes usarlo como lo has estado intentando:
ArrayList<NVP> nameValuePairs = new ArrayList<NVP>(); nameValuePairs.add(new NVP("first_name", first_name)); nameValuePairs.add(new NVP("last_name", last_name)); nameValuePairs.add(new NVP("email", email)); nameValuePairs.add(new NVP("password", password)); /* Move on to step 2 */ Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class); intent.putExtra("nvp", nameValuePairs); startActivity(intent);
En el extremo receptor, tendrá que sacarlo con:
ArrayList<NVP> nameValuePairs = (ArrayList<NVP>) intent.getSerializable("nvp");
EDITAR Bien, lo anterior no funcionará porque BasicNameValuePair
no tiene un constructor predeterminado y el mecanismo de serialización requiere que las clases de antepasados no serializables tengan un constructor predeterminado. De lo contrario obtendrá una excepción en la deserialización.
Desafortunadamente, esto significa que la solución no es tan simple como lo hice. Una Parcelable
es definir su propia clase para implementar Parcelable
, como @keerthana murugesan sugiere en su respuesta . Si has implementado Parcelable
antes, sabes que es un poco de dolor. Otro trabajo en torno a es definir una clase que envuelve un BasicNameValuePair
(en lugar de derivar de él) y gestiona su propia serialización:
public class NVP implements NameValuePair, Serializable { private BasicNameValuePair nvp; public NVP(String name, String value) { nvp = new BasicNameValuePair(name, value); } @Override public String getName() { return nvp.getName(); } @Override public String getValue() { return nvp.getValue(); } // serialization support private static final long serialVersionUID = 1L; private void writeObject(ObjectOutputStream out) throws IOException { out.writeString(nvp.getName()); out.writeString(nvp.getValue()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { nvp = new BasicNameValuePair(in.readString(), in.readString()); } private void readObjectNoData() throws ObjectStreamException { // nothing to do } }
Tuve el mismo problema, tratando de enviar objetos en ArrayList sin implementar Seiralizable en la clase Object.
La solución de acceso directo era envolver ArrayList en Bundle.
Por lo tanto, en la primera actividad ->
ArrayList<Object> objects = new ArrayList<Object>(); // Object class does not implement Serializable interface Bundle extra = new Bundle(); extra.putSerializable("objects", objects); Intent intent = new Intent(getBaseContext(), ShowSpread.class); intent.putExtra("extra", extra);
Segunda actividad ->
Bundle extra = getIntent().getBundleExtra("extra"); ArrayList<Object> objects = (ArrayList<Object>) extra.getSerializable("objects")
Funciona bien.
Necesita pasar una matriz de objetos como Serializable en la intención. La matriz de objetos debe constar de objetos que son inturn Serializable.
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password));
Aquí BaseNameValuePair
necesita ser una clase que implemente Serializable
. Use toArray
de ArrayList
en poner, y typecast a Serializable
. En su actividad getter use getSerializable
en la intención.
Para que esto funcione, el tipo genérico de su lista debe implementar Serializable
.
Esto se puede lograr utilizando la interfaz Parcelable
.
-
Haga que su clase
BasicNameValuePair
implemente InterfazParcelable
esto para más referencia.public class BasicNameValuePair implements Parcelable{ }
-
Agregue estos objetos a una
ArrayList
como lo hizo anteriormente,ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password));
-
Pase estos en la
intent
conputParcelableArrayListExtra()
.intent.putParcelableArrayListExtra ("nvp", nameValuePairs); startActivity(intent);