好吧,我已经阅读了几乎每一个关于堆栈溢出的Parcelable问题,并尝试了许多解决方案来解决这个问题。所以总的来说,我有一个Android项目,我想发送2个
ArrayList
从一个类到另一个类的数组的s
Intent
.
注意:这不是嵌套parcelable线程的副本
here
它不处理数组。它不是
this
因为我已经把所有的嵌套类都做成Parcelable。它不是
this
或
this
因为我没有使用数组列表,而且我认识到错误是初始化失败。它不是
this
因为在这种情况下,我不需要无参数的构造函数(我已经测试了添加一个,它不会改变错误)。它也不是
this
因为它不是嵌套在包中的包。
我必须做一些明显的事情,因为只有在数组未初始化时才会出现nullpointer错误。但是,在我知道数组的长度之前,不可能初始化它…
(作为旁注,也许有人能让我更深入地了解
readTypedList
班级和具体内容
XXX.Creator
因为这无疑是问题的一部分。也适用于未来有同样问题的人
here
是指向
Parcel
JavaDoc提供了大量信息,但没有解决我的问题。)
现在我有了一个显示对象。显示对象仅用于存储
String[]
让它被烤干。与断开的行已在下面进行了注释,对于具有包裹体验的任何人都应该是明显的,因为它显然尚未初始化:
class Display implements Parcelable {
String[] labels;
public Display(String[] labels) {
this.labels = labels;
}
protected Display(Parcel in) {
in.readStringArray(this.labels); // **** THIS LINE BREAKS
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(this.labels);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Display> CREATOR = new Creator<Display>() {
@Override
public Display createFromParcel(Parcel in) {
return new Display(in);
}
@Override
public Display[] newArray(int size) {
return new Display[size];
}
};
}
所以现在我问自己,我能做些什么来解决这个问题,并调查了许多其他有前途的线索,但他们没有解决我的问题。
Here
这是一个我本可以得到的答案
here
他们建议使用
createTypedList()
而不是
readTypedList()
.
但是,我尝试了第一个答案,而且
this
他们不工作,因为我不知道我要多久
字符串[ ]
最终导致了
数组长度错误
错误。第二个答案没有帮助,因为很明显我不想创建一个新的类型列表,而是使用我已有的类型列表,所以通过创建一个新列表,我最终得到一个空白列表,并丢失了我的数据。
所有这些问题的根源是我的包嵌套在另一个包中并通过以下方式调用:
in.readTypedList(allChartLabels, Display.CREATOR);
因为它是嵌套的,所以调用创建者的方式非常限制了我的选项,并导致我无法解决问题。
在各种测试中,我遇到了许多错误,但没有解决方案…(我的代码当前引发的错误是
尝试获取空数组的长度
错误)。
我知道有人对此问题有解决方案,有关更多详细信息,请参阅以下代码:
public class SummaryEntry implements Parcelable {
private ArrayList<Calculation> allChartValues; // NOTE: this is another nested parcel class which is basically a duplicate of Display but with float[]
private ArrayList<Display> allChartLabels;
public SummaryEntry() {
// initialize
allChartValues = new ArrayList<>();
allChartLabels = new ArrayList<>();
}
protected SummaryEntry(Parcel in) {
this();
// order in which we do this matters:
in.readTypedList(allChartLabels, Display.CREATOR);
in.readTypedList(allChartValues, Calculation.CREATOR);
}
@Override
public void writeToParcel(Parcel out, int i) {
// order in which we do this matters, must be same as reading typed lists
out.writeTypedList(allChartLabels);
out.writeTypedList(allChartValues);
}
/// ... getters and setters excluded because of irrelevance ///
/// PARCELABLE METHODS
@Override
public int describeContents() {
return 0;
}
public static final Creator<SummaryEntry> CREATOR = new Creator<SummaryEntry>() {
@Override
public SummaryEntry createFromParcel(Parcel in) {
return new SummaryEntry(in);
}
@Override
public SummaryEntry[] newArray(int size) {
return new SummaryEntry[size];
}
};
}
感谢你花时间阅读这篇长文章。理想情况下,我正在寻找解决方案
字符串[ ]
初始化问题,或者如果有人可以发布包含数组的嵌套包的工作代码,或者最后,也许有人可以指出一种更简单的方法来实现在不嵌套两个包的情况下传递这些项。