tag studio para manager google example attribute apps android parcelable

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.