动态加载数据到ListPreference后摘要无法持久化问题
ListPreference返回设置页面后摘要重置为null的解决方法
问题情况
在SettingActivity中,从Room加载数据展示到ListPreference,选择列表项后值能正确保存到SharedPreferences,摘要也能正常显示,但返回SettingActivity后摘要会重置为null。
问题原因
每次回到SettingActivity时,LiveData会重新触发并设置ListPreference的entries和entryValues,但此时没有根据已保存的选中值重新设置摘要,导致摘要丢失。
解决方法
修改setShopsPreferences方法,在设置完entries和entryValues后,手动根据SharedPreferences中保存的值更新摘要:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.shops.observe(viewLifecycleOwner) { setShopsPreferences(it) } } private fun setShopsPreferences(shops: List<Shop>) { val shopsPreference = preferenceManager.findPreference<ListPreference>("defaultShop") if (shops.isEmpty()) { shopsPreference?.isEnabled = false shopsPreference?.summary = "暂无可用店铺" // 空数据时可设置提示摘要 return } else { shopsPreference?.isEnabled = true } val entries: ArrayList<String> = ArrayList() val entryValues: ArrayList<String> = ArrayList() shops.forEach { entries.add(it.description) entryValues.add(it.id) } shopsPreference?.entryValues = entryValues.toArray(arrayOfNulls<CharSequence>(entryValues.size)) shopsPreference?.entries = entries.toArray(arrayOfNulls<CharSequence>(entries.size)) // 关键:根据已保存的值重新设置摘要 val sharedPref = preferenceManager.sharedPreferences val selectedValue = sharedPref.getString("defaultShop", "") val selectedIndex = entryValues.indexOf(selectedValue) if (selectedIndex != -1) { shopsPreference?.summary = entries[selectedIndex] } }
另外,原ViewModel中的observeForever存在内存泄漏风险,建议简化ViewModel代码:
@HiltViewModel class ShopsViewModel @Inject constructor(repository: ShopsRepository) : ViewModel() { val shops: LiveData<List<Shop>> = repository.getAllShops() }
这样既简洁又能让LiveData被viewLifecycleOwner正确管理,避免内存泄漏。
修改后,每次回到SettingActivity触发LiveData回调时,都会根据已保存的选中值重新设置摘要,解决返回后摘要重置为null的问题。
内容的提问来源于stack exchange,提问作者NiceToMytyuk
相关产品推荐
相关产品推荐

