2016-11-12 34 views
-1

ArrayList<DataField>を引数に渡そうとしていますが、どのメソッドを使用するのか理解できません。フラグメントの引数として配列リストを渡して取得する方法

私はこの

bundle.putSerializable(Constants.ARRAY_DATA, dataArray); 

と私は

getArguments().getSerializable(Constants.ARRAY_DATA) 

を使用してフラグメントに引数を取得しようとすると、私はエラーを取得していますようにフラグメントに引数を送信するために、バンドルを使用しています

互換性のないタイプ。必須:java.util.ArrayListの が見つかり: java.io.Serializableの」

getArguments().getParcelable(Constants.ARRAY_DATA); 

は、任意のエラーを示すのではなく、

bundle.putParcelable(Constants.ARRAY_DATA, dataArray); 

がエラーに

を示しています間違った第2引数型見つかりました: 'java.util.ArrayList'、 必須: 'android.os.Parcelable'

putParcelable バンドル内 を適用することはできません(文字列、 android.os.Parcelable) (文字列、 java.util.ArrayListの) に私は配列を送信するために使用すべき方法

バンドルを介してカスタムデータフィールドのリストを取得し、引数を使用して取得しますか?

+0

'DataField'は' Parcelable'を実装していますか? – Blackbelt

+0

いいえ 'DataField'クラスは何も実装していません。それはゲッターとセッターだけを持っています。 –

+1

それについてのドキュメントを読んでおきたい場合は、 – Blackbelt

答えて

1

事前定義されたメソッドを持つため、プリミティブデータ型をバンドルに渡すのは簡単です。単純に、データを一意のキーで置き、別のアクティビティまたはフラグメントに送信します。しかし、ユーザーがバンドルまたはインテントを介してカスタムオブジェクトを送信したい場合、データフィールドクラスはParcelableインターフェイスを実装する必要があります。

また、Serializable、Parceler、GSON ...を使用することもできます。Parcelableは、オブジェクトを読み書きする最速の方法です。

以下では、パーセル可能の実装を見て、最後にそれを使用してデータを渡す方法を説明します。

ステップ1: ParcelableでのDataFieldクラスを実装する

public class DataField implements Parcelable { 

ステップ2:のDataFieldクラスのすべてのインスタンス変数を保存するためにwriteToParcelメソッド内parcelオブジェクトを使用してください。

public void writeToParcel(Parcel parcel, int i) { 
    parcel.writeString(itemName); 
    parcel.writeString(itemUrl); 
} 

ステップ3:ドキュメントParcelableインタフェースを実装

クラスも Parcelable.Creatorインタフェースを実装するタイプの null以外の静的フィールドと呼ばれるCREATORを持たなければならないと言います。

したがって、このインターフェイスを実装してParcelableを読み取る必要があります。

public static final Creator<DataField> CREATOR = new Creator<DataField>() { 
    @Override 
    public DataField createFromParcel(Parcel in) { 
     return new DataField(in); 
    } 

    @Override 
    public DataField[] newArray(int size) { 
     return new DataField[size]; 
    } 
}; 

ステップ4:createFromParcel方法でreturn文を見てみましょう。クラスの前半で定義していないコンストラクタ(DataField(in))があります。今、このコンストラクタを実装し、以前に保存したすべてのデータを復元します。

private DataField(Parcel in) { 
    itemName = in.readString(); 
    itemUrl = in.readString(); 
} 

すべての変数が同じ順序で読み込まれていることを確認してください。そうしないと、間違った値を間違った変数に格納することになります。

ステップ5:バック活動の、単に

bundle.putParcelableArrayList(Constants.ARRAY_DATA, dataArray); 

ステップ6使用:データ配列

dataArray = getArguments().getParcelableArrayList(Constants.ARRAY_DATA); 
を取得するには、引数やgetParcelableArrayList方法を使用し、フラグメントインサイド

同じ手順を使用して、ArrayList<DataField>のインテントとputParcelableArrayList,getParcelableArrayListを渡すことができます。

関連する問題