ViewPager2嵌套Fragment中SharedPreferences修改不生效问题求助
问题分析与解决方案
你的问题核心出在 SharedPreferences.Editor 的使用方式上,导致修改根本没有被真正保存到SharedPreferences中。
为什么原来的代码不生效?
你定义的 preferencesEditor getter 属性,每次调用都会返回一个全新的 Editor 实例:
val preferencesEditor: SharedPreferences.Editor get() = mPreferences.edit()
在单选按钮的监听里,你用这个新Editor执行了 putInt 操作,但没有立刻提交;到了 onPause 时,你又获取了一个全新的Editor调用 apply()——这个新Editor里根本没有之前的修改记录,自然不会保存任何值,所以日志始终显示默认的12。
方案1:每次修改后立即提交(最简单直接)
直接在单选按钮选中时完成修改并提交,不需要等到 onPause:
override fun onResume() { super.onResume() // 先恢复之前保存的选中状态(提升用户体验) val savedSize = mPreferences.getInt("TXTSZ", 12) when(savedSize) { 12 -> binding.textSize_RB1.isChecked = true 14 -> binding.textSize_RB2.isChecked = true 16 -> binding.textSize_RB3.isChecked = true 18 -> binding.textSize_RB4.isChecked = true 20 -> binding.textSize_RB5.isChecked = true } binding.radioGroupTextSize.setOnCheckedChangeListener { group, checkedId -> mPreferences.edit().run { when (checkedId) { R.id.textSize_RB1 -> putInt("TXTSZ", 12) R.id.textSize_RB2 -> putInt("TXTSZ", 14) R.id.textSize_RB3 -> putInt("TXTSZ", 16) R.id.textSize_RB4 -> putInt("TXTSZ", 18) R.id.textSize_RB5 -> putInt("TXTSZ", 20) } apply() // 立即提交修改 } // 可以在这里实时通知文本Fragment更新UI,比如用ViewModel或广播 } } // 移除onPause里的apply操作,因为已经实时提交了 override fun onPause() { super.onPause() Log.d("PREF", "TEXT SIZE CURRENT VALUE ${mPreferences.getInt("TXTSZ", 12)}. ") }
方案2:统一在onPause提交(适合多配置项批量保存)
如果后续有多个配置项,想统一在Fragment暂停时批量保存,可以先把修改存在内存变量里,再在onPause统一写入:
private var currentTextSize = 12 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mPreferences = requireActivity().getSharedPreferences("pref", Context.MODE_PRIVATE) // 初始化读取保存的值 currentTextSize = mPreferences.getInt("TXTSZ", 12) } override fun onResume() { super.onResume() // 恢复单选按钮选中状态 when(currentTextSize) { 12 -> binding.textSize_RB1.isChecked = true 14 -> binding.textSize_RB2.isChecked = true 16 -> binding.textSize_RB3.isChecked = true 18 -> binding.textSize_RB4.isChecked = true 20 -> binding.textSize_RB5.isChecked = true } binding.radioGroupTextSize.setOnCheckedChangeListener { group, checkedId -> currentTextSize = when (checkedId) { R.id.textSize_RB1 -> 12 R.id.textSize_RB2 -> 14 R.id.textSize_RB3 -> 16 R.id.textSize_RB4 -> 18 R.id.textSize_RB5 -> 20 else -> 12 } } } override fun onPause() { super.onPause() // 统一提交所有修改 mPreferences.edit().putInt("TXTSZ", currentTextSize).apply() Log.d("PREF", "TEXT SIZE SET TO ${mPreferences.getInt("TXTSZ", 12)}. ") }
文本Fragment的UI更新建议
要让文本Fragment显示修改后的大小,需要在合适的时机读取SharedPreferences并更新UI,比如在onResume中:
// 文本Fragment的代码示例 override fun onResume() { super.onResume() val pref = requireActivity().getSharedPreferences("pref", Context.MODE_PRIVATE) val textSize = pref.getInt("TXTSZ", 12) yourTextView.textSize = textSize.toFloat() }
如果需要实时更新(不用切换Fragment就能看到效果),可以用SharedPreferences.OnSharedPreferenceChangeListener监听变化,或者用ViewModel共享状态。
内容的提问来源于stack exchange,提问作者Tongireth
相关产品推荐
相关产品推荐

