android - studio - title html attribute
¿Cuál es el parámetro para Parcel.readStringArray()? (3)
Estoy tratando de guardar el estado en mi Fragment
mediante el uso de Parcelable
.
Esto me llevó al siguiente código cuando deseo recuperar la matriz de cadenas que guardé en el Parcelable:
public MyObject createFromParcel(Parcel in) {
titles=in.readStringArray(???);
}
Ahora readStringArray
necesita un parámetro, una String[]
... ¿Pero por qué? Podría simplemente dar las cuerdas que almacené en él. No sé a priori cuántos eran, así que esto apesta. :(
La documentation dice lo siguiente:
Eso no es nada.
EDIT: si alguien tiene el mismo problema: terminé usando writeBundle()
/ readBundle()
y poniendo mi String[]
en el Bundle
.
Aquí hay una implementación de este método desde 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");
}
}
Entonces escribe valores a una matriz dada. Y no devuelve nada.
Creo que podría ser útil ver estos dos métodos, readStringArray(String[] val)
y createStringArray()
lado a lado:
Veamos primero el método readStringArray(String[] val)
. Requiere una String[]
como parámetro y puede resultar en una NullPointerException
si pasa un objeto de matriz no inicializado ( null
). Además, tendrás que saber exactamente la longitud de la matriz (N), de lo contrario obtendrás la RuntimeException
del método:
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");
}
}
Oh, por otra parte, con createStringArray()
no es necesario que forme y proporcione un String[]
como parámetro, el método lo formará con la longitud correcta, por lo que no tiene que preocuparse ya sea NullPointerException
o 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;
}
}
En general, como resultado de este análisis básico, podemos llegar a conclusiones y decir que el segundo método es mejor y más seguro.
Use createStringArray()
lugar de readStringArray(String[])
. Le devolverá la matriz que necesita.