18

Fragmentを使用して状態を保存しようとしていますParcelable

これにより、Parcelableに保存したString配列を取得したいときに、次のコードが表示されます。

public MyObject createFromParcel(Parcel in) {
            titles=in.readStringArray(???);
}

ここreadStringArrayでパラメータが必要String[]です...しかし、なぜですか?それは私がそれに保存した文字列を与えることができます。先験的にいくつあったかわからないので、これは最悪です。:(

ドキュメントには次のように書かれています。

つまり、何もありません。

編集:誰かが同じ問題を抱えている場合:私はwriteBundle()/readBundle()を使用して自分をに入れてString[]しまいましたBundle

4

3 に答える 3

54

createStringArray()の代わりに使用してくださいreadStringArray(String[])。必要な配列が返されます。

于 2013-07-24T15:25:11.783 に答える
10

Android4.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");
    }
}

したがって、指定された配列に値を書き込みます。そして何も返しません。

于 2012-12-27T13:46:10.623 に答える
3

readStringArray(String[] val)これらの2つの方法をcreateStringArray()並べて表示すると便利な場合があります。

最初に方法を見てみましょうreadStringArray(String[] val)String[]パラメータとしてaが必要であり、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");
    }
}

一方、パラメータとしてaを作成して指定createStringArray()する必要がない場合は、正しい長さのメソッドによっても作成されるため、次のいずれかString[]について心配する必要はありません。NullPointerExceptionRuntimeException

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

全体として、この基本的な分析の結果として、結論にジャンプして、2番目の方法がより優れて安全であると言うことができます。

于 2018-08-15T11:53:46.430 に答える