41

JSONデータ(新しいDVDタイトル)を返す外部APIを使用しています。JSONを解析して、各DVDタイトルとその他のDVD情報をListViewにリストすることができます。また、プリミティブデータ(タイトル文字列)に対してonListItemClickメソッドを適切に設定することもできました。私はonListItemClickメソッドに対してそのようなものを書くことになりました:

ちなみに、productArrayは、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にあると思います。各データポイントを個別に設定する代わりに、DVDムービーのすべてのデータを含むJSONObjectを渡すことができると考えていました。

Parcelableの使い方を理解するために1週間半試しました。運が悪かったParcelableを実装する新しいJSONObjectjsonObjをインスタンス化してみました。LogCatで、オブジェクトがパーセルできないというエラーが発生し続けました。

Android開発者サイトや他のブログを読んでみましたが、それらの例を必要なものに適用できませんでした。

どんな助けでも大歓迎です

4

7 に答える 7

202

JSONObject全体を文字列として配置するだけです。このようなもの:

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

そして、MovieProductActivityあなたは

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

于 2011-03-14T15:04:07.337 に答える
24

現在の活動から

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();
}
于 2016-01-16T22:43:11.483 に答える
14

映画に関するすべての情報をMovie、を実装するオブジェクトにカプセル化するだけParcelableです。

コードは上記のようになりますが、6つの異なるエクストラを渡す代わりに、ムービーである1つのエクストラを渡すことができます。

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」の各文字列を正しい順序で読み取ります。

于 2011-02-22T18:41:28.057 に答える
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)のインスタンスを作成し、以下の例のようにバンドルを通過させることです。

//これは、Activity、Fragment、DialogFragment、または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)

この助けを願って、いくつかのことをクリアします。パーセラブルインターフェイスは、ミューテーターやアクセサーの有無にかかわらず、任意のデータクラスで使用できます。

于 2014-09-17T06:02:52.487 に答える
1

情報をDBに保存していますか?もしそうなら、あなたは単に(インテントを介して)希望のタイトルのIDを渡すことができます。

于 2011-02-22T18:54:51.263 に答える
1

gsonを見てください。これにより、JSONBLOBをクラスインスタンス全体にシリアル化および逆シリアル化できます。

于 2011-02-22T19:06:36.660 に答える
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();
于 2016-12-31T00:46:57.633 に答える