簡體   English   中英

將JSONObject傳遞給另一個活動

[英]Passing JSONObject into another activity

我正在點擊一個返回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開發者網站和其他博客,但我無法將他們的示例應用到我需要做的事情上。

任何幫助將非常感激

您可以簡單地將整個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);

來自Target Activity的onCreate

try {
   json_object = new JSONObject(getIntent().getStringExtra("ITEM_EXTRA"));

   Log.e(TAG, "Example Item: " + json_object.getString("KEY"));

} catch (JSONException e) {
   e.printStackTrace();
}

您可以將有關電影的所有信息封裝到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'中的每個字符串。

謝麗爾西蒙在這里發布的答案是完全正確的,但對於剛接觸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和/或訪問器的數據類一起使用。

只需像這樣創建一個包:

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

您是否將數據存儲在數據庫中? 如果是,您只需傳遞所需標題的ID(通過意圖)。

看看gson。 它允許您將JSON blob重新安排和反序列化為整個類實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM