我在我的活动类中编写了以下代码,
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)为null 对象参考
我添加了调试点,找出问题的原因,它成功地将数据从Activity
添加到Bundle,但它没有在Fragment中获取任何数据。
请指导我在这里做错了什么。
修改 Parceable Class
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);
}
答案 0 :(得分: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或类似内容......
答案 1 :(得分: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];
}
};
}
答案 2 :(得分:0)
尝试在getArguments()
或onCreate()
中获取Bundle对象(onCreateView()
)
片段而不是onActivityCreated()
。
请参阅Fragment documentation中的示例。
答案 3 :(得分:0)
你可以试试吗。
ArrayList<TXData> dataList = new ArrayList<>();
dataList.addAll(getArguments().getParcelableArrayList("data"));
答案 4 :(得分:0)
您的writeToParcel方法不完整。
您的writeToParcel应该以与参数化构造函数中相同的顺序编写所有属性:protected TXSectionData(Parcel in)
点击此处:tutorial
要密切关注的一件非常重要的事情是您在Parcel中编写和读取值的顺序。他们需要在两种情况下都匹配。 Android用于读取Parcel的机制是盲目的,完全信任您以使订单正确,否则您将遇到运行时崩溃。