0

我已經寫了下面的在我的活動類的代碼,如何從活動得到Parcable捆綁在一個片段

ArrayList<TXData> data; 
data= Map.getDataList(); 

Bundle bundle = new Bundle(); 
bundle.putParcelableArrayList("data",data); 

Fragment fragment = new MapsFragment(); 
fragment.setArguments(bundle); 

MapsFragment,我已經寫了下面的代碼來獲得onActivityCreated()方法的數據。

ArrayList<TXData> dataList; 

dataList=getArguments().getParcelableArrayList("data"); 

它在Fragment類上返回以下異常。

所致:顯示java.lang.NullPointerException:嘗試在一個空 對象引用調用虛擬方法 java.util.ArrayList的 android.os.Bundle.getParcelableArrayList(java.lang.String中)

我添加了調試點,以找出問題的原因,它成功地將數據添加到來自Activity的Bundle,但它沒有在Fragment中獲取任何數據。

請引導我在這裏做錯了什麼。

EDIT Parceable類

public class TXData implements Serializable, Parcelable{ 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 

    public TXSData(){ 

    } 


    protected TXData(Parcel in) { 
     id = in.readString(); 
     title = in.readString(); 
     pId = in.readString(); 
     heading = in.readFloat(); 
     pitch = in.readFloat(); 
     totalCount = in.readInt(); 
     mData = in.readInt(); 
     minPrice = in.readInt(); 
     maxPrice = in.readInt(); 
     isInFilter = in.readByte() != 0; 
     isEnabled = in.readByte() != 0; 
     totalCount = in.readInt(); 
    } 




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

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



    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(mData); 

    } 
+2

TXData你可以在問題中顯示這個類嗎? –

+1

你在'onCreateView'上試過了嗎? –

+0

@SurajRao:我已經更新了我的問題。 @ρяσѕρєяK:是的,onCreateView在Activity onCreate完成其工作之前調用,因此無法將數據添加到包中。而'onActivityCreated'成功地將數據添加到Bundle – Kirmani88

回答

0

嘗試獲得的Bundle對象()在該片段中的onCreate()onCreateView() 和不onActivityCreated()

請參閱Fragment documentation中的示例。

0

你可以試試。

ArrayList<TXData> dataList = new ArrayList<>(); 

dataList.addAll(getArguments().getParcelableArrayList("data")); 
0

您的writeToParcel方法不完整。 你writeToParcel應該寫在同一順序的所有屬性,因爲它是參數化的構造器:protected TXSectionData(Parcel in)

入住這裏:tutorial

的一個非常重要的事情要密切關注的是爲了你在包裹中寫入和讀取值。他們需要在兩種情況下匹配。 Android用來閱讀包裹的機制是盲目的,並且完全信任您獲得正確的訂單,否則您將遇到運行時崩潰。

1

簡單的解決方案是放棄Parcelable並保持Serializable。

public class TXData implements Serializable{ 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 
} 

,並使用putExtra/getSerializableExtera代替getParcelableArrayList/setParcelableArrayList

對於大數據量,建議使用Parcelable這是爲速度而,請參閱本post或類似的...

+0

bundle.putExtra不存在。 – Kirmani88

1

更換下方類。

public class TXData implements Parcelable { 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 

    public TXSData(){ 

    } 



    protected TXData(Parcel in) { 
     id = in.readString(); 
     title = in.readString(); 
     pId = in.readString(); 
     heading = in.readFloat(); 
     pitch = in.readFloat(); 
     totalCount = in.readInt(); 
     mData = in.readInt(); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(id); 
     dest.writeString(title); 
     dest.writeString(pId); 
     dest.writeFloat(heading); 
     dest.writeFloat(pitch); 
     dest.writeInt(totalCount); 
     dest.writeInt(mData); 
    } 

    @SuppressWarnings("unused") 
    public static final Parcelable.Creator<TXData> CREATOR = new Parcelable.Creator<TXData>() { 
     @Override 
     public TXData createFromParcel(Parcel in) { 
      return new TXData(in); 
     } 

     @Override 
     public TXData[] newArray(int size) { 
      return new TXData[size]; 
     } 
    }; 
} 
相關問題