habe ich versucht, die Lösung SerializableSparseArray
verlauf SparseArray
was es ermöglicht, die Erstellung über Bundle.putSerializable
Anruf ein SparseArray
in Bündel zu setzen.
Aber ich fand, dass ich das gespeicherte Objekt aus dem Bündel in onRestoreInstanceState
nicht erhalten kann. In das Problem eingrabend fand ich, dass savedInstanceState.getSerializable(KEY_TO_STRING_SPARSE_ARRAY) == null
.
Dann versuchen savedInstanceState.get(KEY_TO_STRING_SPARSE_ARRAY)
zu überprüfen und überraschenderweise eine SparseArray<String>
nicht SerializableSparseArray<String>
. Schließlich verwende ich savedInstanceState.getSparseParcelableArray(KEY_TO_STRING_SPARSE_ARRAY)
, um SparseArray
zurück von einem Bündel zu erhalten.
Verwenden Sie dann Java Reflection, um eine SparseArray<String>
zu speichern, um direkt zu bündeln, ohne mit Serializable
oder Schnittstelle zu erweitern. Es ist ein bisschen schmutzig, aber ich denke, Sie können Ihre eigene Dienstprogrammfunktion machen, die die folgende Detailimplementierung versteckt.
try {
// FIXME WTF
Method m = Bundle.class.getMethod("putSparseParcelableArray", String.class, SparseArray.class);
m.invoke(savedInstanceState, KEY_TO_STRING_SPARSE_ARRAY, mSparseStringArray);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
Log.e(TAG, "exception", e);
}
Ich habe den Code getestet und es funktioniert auf Android 4.4.4. Und ich würde gerne wissen, ob es sicher ist, die Implementierung in anderen SDK-Implementierungen zu verwenden.
Möglicherweise müssen Sie 'onSaveInstanceState()' überhaupt nicht verwenden. Siehe http://stackoverflow.com/questions/24294919/maintain-item-selection-on-orientation-change – faizal