You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:52:32