如何从片段中的活动中获取Parcable Bundle

时间:2016-12-21 08:51:37

标签: android android-layout listview android-fragments parcelable

我在我的活动类中编写了以下代码,

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

    }

5 个答案:

答案 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的机制是盲目的,完全信任您以使订单正确,否则您将遇到运行时崩溃。