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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:47:44