Transmisión de JSONObject a otra actividad
Estoy golpeando una API externa que está devolviendo datos JSON (nuevos títulos de dvd). Soy capaz de analizar el JSON y la lista de cada título de DVD y otra información de dvd en un ListView muy bien. También pude configurar un método onListItemClick muy bien para los datos primitivos (cadena de título). Terminé escribiendo algo así para el método onListItemClick:
Sólo para notar, el productArray es un var de clase que está siendo establecido por otro método que contiene una matriz de JSONObjects.
- Android: Parcelable.writeToParcel y Parcelable.Creator.createFromParcel nunca se llaman
- RealmObject AND Parcelable
- Android Parcelable en Kotlin
- Fragmentos de Android que conservan datos
- Android Parcelable y objeto que pasa por referencia
protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Intent i = new Intent(DvdListingActivity.this, MovieProductActivity.class); try { JSONObject jsonObj = productArray.getJSONObject(position); i.putExtra("mTitle", jsonObj.getJSONObject("Title").opt("val").toString()); i.putExtra("mRelDate", jsonObj.getJSONObject("RelDate").opt("val").toString()); i.putExtra("mDesc", jsonObj.getJSONObject("Desc").opt("val").toString()); i.putExtra("mRating", jsonObj.getJSONObject("MPAA").getJSONObject("Rating").opt("val").toString()); i.putExtra("mActors", jsonObj.getJSONObject("Actors").opt("val").toString()); i.putExtra("mImage", jsonObj.getJSONObject("Image").opt("val").toString()); startActivity(i); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
El código anterior funciona, pero estoy pensando que hay que ser una manera mejor para mí para pasar los datos a otra actividad. Pensaba que podría pasar un JSONObject que contiene todos los datos para una película del dvd en vez de fijar cada punto de datos individualmente.
He intentado durante una semana y media para averiguar cómo usar Parcelable. Intenté instanciar un JSONObject nuevo jsonObj que implementa Parcelable sin suerte. Seguí recibiendo un error en mi LogCat que decía que el objeto era un-parcelable.
He intentado leer el sitio de desarrolladores de Android y otros blogs, pero no pude aplicar sus ejemplos a lo que tenía que hacer.
Cualquier ayuda sería muy apreciada
- Pase la matriz 2D a otra actividad
- Android: pasar el objeto del widget de recopilación a la actividad
- Cómo hacer una lista <enum> parcelable?
- Parcelable y herencia en Android
- ¿Qué es una comunicación más rápida usando un mensajero o una intención?
- Odd Error "Clase no encontrada al desmarcar"
- Android Parcelable - Escriba y lea ArrayList <IA> cuando IA es una interfaz
- Falta el campo CREATOR Parcelable?
Sólo puede encapsular toda la información sobre una película en un objeto Movie
, que implementa Parcelable
.
El código se verá similar al anterior, pero en lugar de pasar 6 extras diferentes, sólo puede pasar un extra que es la película.
Movie movie = new Movie(); movie.setTitle(jsonObj.getJSONObject("Title").opt("val").toString()); movie.setRelDat(jsonObj.getJSONObject("RelDate").opt("val").toString()); . . . i.putExtra("movie", movie);
Para obtener información sobre la implementación de un objeto Parcelable, consulte Documentos parcelables . Usted básicamente acaba de escribir cada cadena en 'writeToParcel', y leer en cada cadena de 'readFromParcel' en el orden correcto.
Simplemente puede poner un JSONObject entero como una cadena. Algo como esto:
i.putString("product", jsonObj.toString);
Y luego en el MovieProductActivity
usted podría
JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));
La respuesta publicada aquí por Cheryl Simon es completamente correcta sin embargo esto no podría explicar demasiado claramente para alguien que es nuevo en Android o java. Por favor, déjame construir sobre su respuesta.
La mejor y más limpia forma de hacerlo es con la interfaz Parcelable.
Declare una clase como abajo que implementa Parcelable. Éste utiliza un accesor y mutador que no es realmente necesario.
public class JSonArrayParser implements Parcelable { private JSONArray jsonArray; public JSonArrayParser() {} public JSonArrayParser(JSONArray jsonArray) { this.jsonArray = jsonArray; } public void setJsonArray(JSONArray jsonArray) { this.jsonArray = jsonArray; } public JSONArray getJsonArray() { return jsonArray; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { } }
El siguiente paso sería crear una instancia de esa clase (en este caso JSonArrayParser) y pasarla a través del Bundle como en el ejemplo siguiente.
// Esto podría ser una Actividad, Fragmento, DialogFragment o cualquier clase que use el tipo de paquete como savedInstanceState.
jobItemsPopUp = new JobItemsPopUp();//This example uses a DialogFragment. Bundle bundle = new Bundle(); JSonArrayParser jSonArrayParser = new JSonArrayParser(jsonArray); bundle.putParcelable("jsonArray", jSonArrayParser); jobItemsPopUp.setArguments(bundle); jobItemsPopUp.show(getActivity().getSupportFragmentManager(), "JobItemsPopUp");
La forma en que su recuperación del valor sería la siguiente (he utilizado el onCreate pero puede recuperar el valor en cualquier lugar):
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { this.jsonArray = ((JSonArrayParser) getArguments().getParcelable("jsonArray")).getJsonArray(); } }
Sólo como una nota adicional: puede hacer esto con constructores personalizados, pero este método ha sido obsoleto por Google. El antiguo método obsoleto (asociado con la app app compat v4 NO RECOMENDADO ) sería:
private Fragment MyFragment; MyFragment = new MyFragment(jsonArray)
Espero que esta ayuda y aclara algunas cosas. La interfaz Parcelable se puede utilizar con cualquier clase de datos con o sin mutators y / o accessors.
De la actividad actual
Intent mIntent = new Intent(CurrentActivity.this, TargetActivity.class); mIntent.putExtra("ITEM_EXTRA", json_object.toString()); startActivity(mIntent);
De la actividad de la actividad objetivo
try { json_object = new JSONObject(getIntent().getStringExtra("ITEM_EXTRA")); Log.e(TAG, "Example Item: " + json_object.getString("KEY")); } catch (JSONException e) { e.printStackTrace(); }
¿Está almacenando la información en un DB? Si es así, simplemente puede pasar el ID del título deseado (a través de la intención).
Echa un vistazo a gson. Le permite sereialise y deserialise bloques JSON a instancias de clase enteras.
Simplemente crea un paquete como este:
public class Parcel implements Serializable { private JSONObject obj; public Parcel(JSONObject obj) { this.obj = obj; } public JSONObject getObj() { return obj; }}
Y poner en el paquete:
Parcel p = new Parcel(data); Bundle args = new Bundle(); args.putSerializable("events", p);
Finalmente, puede recuperar el JSONObject utilizando:
JSONObject obj = ((Parcel) ((Bundle) getArguments()).getSerializable("events")).getObj();
- La superposición de fragmentos ocultos después de la aplicación se muere y se restaura
- Cómo ocultar la barra de navegación de forma permanente en la actividad android?