我正在尝试通过Fragment
使用Parcelable
来保存状态。
当我希望找回我在Parcelable中保存的String数组时,这会产生以下代码:
public MyObject createFromParcel(Parcel in) {
titles=in.readStringArray(???);
}
现在readStringArray
需要一个参数,String[]
......但为什么呢?它可以只给出我存储在其中的字符串。我不知道先天有多少,所以这很糟糕。 :(
documentation说明如下:
即没有。
编辑:如果有人遇到同样的问题:我最后使用writeBundle()
/ readBundle()
并将String[]
放入Bundle
。
答案 0 :(得分:49)
使用createStringArray()
代替readStringArray(String[])
。它将返回您需要的数组。
答案 1 :(得分:10)
以下是Android 4.1.2中此方法的实现:
public final void readStringArray(String[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
val[i] = readString();
}
} else {
throw new RuntimeException("bad array lengths");
}
}
因此它将值写入给定数组。没有回报。
答案 2 :(得分:1)
我认为并排查看readStringArray(String[] val)
和createStringArray()
这两种方法可能会有用:
首先让我们看一下readStringArray(String[] val)
方法。它需要一个String[]
作为参数,并且如果您传递一个未初始化的数组对象(NullPointerException
),则可能会导致一个null
。另外,您还必须确切知道数组的长度(N),否则将从方法中抛出RuntimeException
:
public final void readStringArray(String[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
val[i] = readString();
}
} else {
throw new RuntimeException("bad array lengths");
}
}
另一方面,使用createStringArray()
不需要形成并提供String[]
作为参数,它也将通过正确长度的方法为您形成,因此您不必担心NullPointerException
或RuntimeException
:
public final String[] createStringArray() {
int N = readInt();
if (N >= 0) {
String[] val = new String[N];
for (int i=0; i<N; i++) {
val[i] = readString();
}
return val;
} else {
return null;
}
}
总而言之,作为此基础分析的结果,我们可以得出结论,说第二种方法更好,更安全。