Передача JSONObject в другое действие
Я использую внешний API, который возвращает данные JSON (новые названия dvd). Я могу разобрать JSON и перечислить каждый заголовок dvd и другую информацию dvd в ListView просто отлично. Мне также удалось установить метод onListItemClick, который отлично подходит для примитивных данных (строка заголовка). В итоге я написал что-то вроде этого для метода onListItemClick:
Просто отметим, что productArray - это класс 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 и другие блоги, но я не мог применить их примеры к тому, что мне нужно было сделать.
Любая помощь будет высоко оценена
Ответы
Ответ 1
Вы можете просто инкапсулировать всю информацию о фильме в объект 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 docs. Вы в основном просто записываете каждую строку в 'writeToParcel' и читаете в каждой строке в readFromParcel в правильном порядке.
Ответ 2
Вы можете просто поместить весь JSONObject в виде строки. Что-то вроде этого:
i.putString("product", jsonObj.toString);
А затем в MovieProductActivity
вы могли бы
JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));
Ответ 3
Ответ, размещенный здесь Шерил Саймон, абсолютно прав, однако это может не объяснить это слишком четко для тех, кто новичок в андроиде или java. Пожалуйста, позвольте мне ответить на ее ответ.
Лучший и самый чистый способ сделать это с помощью интерфейса Parcelable.
Объявите класс, как показано ниже, который реализует 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) {
}
}
Следующим шагом будет создание экземпляра этого класса (в данном случае JSonArrayParser) и передача его через Bundle, как в примере ниже.
//Это может быть Activity, Fragment, DialogFragment или любой класс, который использует тип 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 может использоваться с любым классом данных с или без использования мутаторов и/или аксессуаров.
Ответ 4
От текущей активности
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();
}
Ответ 5
Сохраняете ли вы информацию в БД? Если да, вы можете просто передать идентификатор нужного названия (через намерение).
Ответ 6
Посмотрите на gson. Это позволяет выполнять сериализацию и десериализацию капель JSON для всех экземпляров класса.
Ответ 7
Просто создайте парцеллу:
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();