Я попробовал решение, создающее SerializableSparseArray
расширение SparseArray
, позволяющее поместить SparseArray
в пакет через вызов Bundle.putSerializable
.
Но я обнаружил, что не могу получить сохраненный объект из пакета в onRestoreInstanceState
. Копаясь в вопросе, я обнаружил, что savedInstanceState.getSerializable(KEY_TO_STRING_SPARSE_ARRAY) == null
.
Затем, пытаясь осмотреть savedInstanceState.get(KEY_TO_STRING_SPARSE_ARRAY)
, получил SparseArray<String>
, а не SerializableSparseArray<String>
. Наконец, я использую savedInstanceState.getSparseParcelableArray(KEY_TO_STRING_SPARSE_ARRAY)
для получения SparseArray
обратно из пакета.
Затем, используя отражение java, сохраните SparseArray<String>
в пакет напрямую, не расширяя его с помощью интерфейса Serializable
или Parcelable
. Это немного грязно, но я думаю, вы можете сделать свою собственную служебную функцию, скрывающую следующую детальную реализацию.
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);
}
Я протестировал код, и он работает на Android 4.4.4. И я хотел бы знать, безопасно ли использовать реализацию в других реализациях SDK.
person
kirisetsz
schedule
08.08.2014
onSaveInstanceState()
. См. stackoverflow.com/questions/24294919/< /а> - person faizal   schedule 19.06.2014