我正在点击一个返回JSON数据的外部API(新的dvd标题)。我能够解析出JSON并将每个DVD标题和其他DVD信息列入ListView就好了。我还能够为原始数据(标题字符串)设置一个onListItemClick方法。我最终为onListItemClick方法写了类似的内容:
请注意,productArray是一个类var,由另一个包含JSONObject数组的方法设置。
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是一种更好的方式让我将数据传递给另一个Activity。我以为我能够传递一个包含dvd影片所有数据的JSONObject,而不是单独设置每个数据点。
我试了一个半星期才弄明白如何使用Parcelable。我尝试实例化一个新的JSONObject jsonObj,它实现了Parcelable而没有运气。我一直在我的LogCat中收到错误,说该对象是不可分割的。
我尝试过阅读Android开发者网站和其他博客,但我无法将他们的示例应用到我需要做的事情上。
非常感谢任何帮助
答案 0 :(得分:190)
您可以简单地将整个JSONObject作为字符串。这样的事情:
i.putString("product", jsonObj.toString);
然后在MovieProductActivity
你可以
JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));
答案 1 :(得分:14)
来自当前活动
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();
}
答案 2 :(得分:13)
您可以将有关电影的所有信息封装到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'中的每个字符串。
答案 3 :(得分:7)
Cheryl Simon在这里发布的答案是完全正确的,但对于刚接触android或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 Type的类,例如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 NOT RECOMMENDED 相关联)将是:
private Fragment MyFragment;
MyFragment = new MyFragment(jsonArray)
希望得到这个帮助,并清除一些事情。 Parcelable接口可以与任何具有或不具有mutator和/或访问器的数据类一起使用。
答案 4 :(得分:1)
您是否将信息存储在数据库中?如果是,您只需传递所需标题的ID(通过意图)。
答案 5 :(得分:1)
看看gson。它允许您将JSON blob序列化和反序列化为整个类实例。
答案 6 :(得分:1)
只需像这样创建一个包:
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();