Android 13(Tiramisu)中getSparseParcelableArray过时,该如何修复?
修复Android 13+中Bundle.getSparseParcelableArray过时问题
从Android 13(API 33)开始,Bundle.getSparseParcelableArray(@Nullable String key)及对应写入方法putSparseParcelableArray均被标记为过时,官方推荐使用基于ArrayList的Parcelable存储API替代。以下是两种修复方案:
方案一:保留SparseArray结构(兼容原有代码)
如果你的业务逻辑依赖SparseArray的int键访问特性,可以通过转换方法适配新API:
首先添加SparseArray与ArrayList的互转工具方法:
// 将ArrayList转换为SparseArray private fun ArrayList<Fragment.SavedState>.toSparseArray(): SparseArray<Fragment.SavedState> { val sparseArray = SparseArray<Fragment.SavedState>() forEachIndexed { index, savedState -> sparseArray.put(index, savedState) } return sparseArray } // 将SparseArray转换为ArrayList private fun SparseArray<Fragment.SavedState>.toArrayList(): ArrayList<Fragment.SavedState> { val arrayList = ArrayList<Fragment.SavedState>() for (i in 0 until size()) { arrayList.add(valueAt(i)) } return arrayList }
然后修改原有代码的读写逻辑:
private var savedStateSparseArray = SparseArray<Fragment.SavedState>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState != null) { val savedStateList = savedInstanceState.getParcelableArrayList<Fragment.SavedState>( SAVED_STATE_CONTAINER_KEY ) savedStateSparseArray = savedStateList?.toSparseArray() ?: savedStateSparseArray } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val savedStateList = savedStateSparseArray.toArrayList() outState.putParcelableArrayList(SAVED_STATE_CONTAINER_KEY, savedStateList) }
方案二:直接改用ArrayList(推荐)
如果没有特殊的int键访问需求,直接将存储类型改为ArrayList是更简洁的方案,完全贴合官方推荐的API使用方式:
private var savedStateList = arrayListOf<Fragment.SavedState>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState != null) { savedStateList = savedInstanceState.getParcelableArrayList<Fragment.SavedState>( SAVED_STATE_CONTAINER_KEY ) ?: savedStateList } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putParcelableArrayList(SAVED_STATE_CONTAINER_KEY, savedStateList) }
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

