Передача JSONObject в другое действие

Я удаляю внешний API, который возвращает данные JSON (новые названия dvd). Я могу разобрать JSON и перечислить каждый заголовок dvd и другую информацию dvd в ListView просто отлично. Мне также удалось установить метод onListItemClick, который отлично подходит для примитивных данных (строка заголовка). Я закончил писать что-то вроде этого для метода onListItemClick:

Просто отметим, что productArray – это class var, который устанавливается другим методом, который содержит массив JSONObjects.

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(); } } 

Вышеприведенный код работает, но я думаю, что GOTTA – лучший способ передать данные другим действиям. Я думал, что я смогу передать JSONObject, который содержит все данные для фильма dvd, вместо того, чтобы устанавливать каждую точку данных отдельно.

Я пробовал в течение полутора недель, чтобы выяснить, как использовать Parcelable. Я попытался создать экземпляр нового JSONObject jsonObj, который реализует Parcelable без везения. Я продолжал получать ошибку в своем LogCat, который сказал, что объект был необоснован.

Я пробовал читать сайт разработчика Android и другие блоги, но я не мог применить их примеры к тому, что мне нужно было сделать.

Любая помощь приветствуется

Вы можете просто инкапсулировать всю информацию о фильме в объект Movie , который реализует Parcelable .

Код будет похож на выше, но вместо того, чтобы пропустить 6 разных дополнений, вы можете просто передать один дополнительный фильм.

 Movie movie = new Movie(); movie.setTitle(jsonObj.getJSONObject("Title").opt("val").toString()); movie.setRelDat(jsonObj.getJSONObject("RelDate").opt("val").toString()); . . . i.putExtra("movie", movie); 

Информацию о реализации объекта Parcelable см. В документах Parcelable . Вы в основном просто записываете каждую строку в ‘writeToParcel’ и читаете в каждой строке в readFromParcel в правильном порядке.

Вы можете просто поместить весь JSONObject в виде строки. Что-то вроде этого:

i.putString("product", jsonObj.toString);

А затем в MovieProductActivity вы могли бы

JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));

Из текущей деятельности

 Intent mIntent = new Intent(CurrentActivity.this, TargetActivity.class); mIntent.putExtra("ITEM_EXTRA", json_object.toString()); startActivity(mIntent); 

Из целевого действия onCreate

 try { json_object = new JSONObject(getIntent().getStringExtra("ITEM_EXTRA")); Log.e(TAG, "Example Item: " + json_object.getString("KEY")); } catch (JSONException e) { e.printStackTrace(); } 

Ответ, размещенный здесь Шерил Саймон, абсолютно прав, однако это может не объяснить это слишком четко для тех, кто новичок в андроиде или java. Пожалуйста, позвольте мне ответить на ее ответ.

Лучший и самый чистый способ сделать это – с интерфейсом Parcelable.

Объявите class, как показано ниже, который реализует Parcelable. В этом случае используется аксессор и мутатор, который на самом деле не нужен.

 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) { } } 

Следующим шагом было бы создать экземпляр этого classа (в данном случае JSonArrayParser) и передать его через Bundle, как в приведенном ниже примере.

// Это может быть Activity, Fragment, DialogFragment или любой class, который использует тип Bundle, такой как 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"); 

То, как вы получите значение, будет следующим: я использовал onCreate, но вы можете получить значение в любом месте:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { this.jsonArray = ((JSonArrayParser) getArguments().getParcelable("jsonArray")).getJsonArray(); } } 

Также как дополнительное примечание: вы можете сделать это с помощью специальных конструкторов, но этот метод не поддерживается Google. Старый устаревший метод (связанный с app compat v4 НЕ РЕКОМЕНДУЕТСЯ ):

 private Fragment MyFragment; MyFragment = new MyFragment(jsonArray) 

Надейтесь на эту помощь и проясните несколько вещей. Интерфейс Parcelable может использоваться с любым classом данных с или без использования мутаторов и / или аксессуаров.

Вы храните информацию в БД? Если да, вы можете просто передать идентификатор нужного заголовка (через намерение).

Посмотрите на gson. Это позволяет выполнять сериализацию и десериализацию капель JSON для всех экземпляров classа.

Просто создайте партию следующим образом:

 public class Parcel implements Serializable { private JSONObject obj; public Parcel(JSONObject obj) { this.obj = obj; } public JSONObject getObj() { return obj; }} 

И положил в пучок:

 Parcel p = new Parcel(data); Bundle args = new Bundle(); args.putSerializable("events", p); 

Наконец, вы можете вернуть JSONObject, используя:

 JSONObject obj = ((Parcel) ((Bundle) getArguments()).getSerializable("events")).getObj(); 
  • Как передать значения из одной активности в предыдущую деятельность
  • Android - возврат к предыдущему действию с различным значением Intent
  • Жизненный цикл Android Fragment над изменениями ориентации
  • Как определить, является ли какая-либо из моих операций самой фронтальной и видимой для пользователя?
  • как убить вспомогательные действия и довести активность до стека
  • как узнать вызывающую деятельность в android
  • Android получает предыдущую активность
  • Изменить начальную активность приложения
  • Как изменить название Activity на Android?
  • Запуск операции с параметром
  • Как создать прозрачную активность на Android?
  • Давайте будем гением компьютера.