【问题标题】:SharedPreference won't apply change (in a fragment)SharedPreference 不会应用更改(在片段中)
【发布时间】:2021-06-29 13:40:23
【问题描述】:

在我的活动中,有一个 ViewPager2 加载了一个显示文本的片段和另一个片段,该片段旨在具有诸如显示在另一个片段上的文本大小之类的选项。为了让它不必每次我选择使用SharedPreferences时都设置选项,但它不会生效。代码如下:

class Options : Fragment() {
   lateinit var binding: OptionsLayoutBinding
   private lateinit var mPreferences: SharedPreferences
   val preferencesEditor: SharedPreferences.Editor get() = mPreferences.edit()

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       mPreferences = this.requireActivity().getSharedPreferences("pref", Context.MODE_PRIVATE)
   }

   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
       binding = OptionsLayoutBinding.inflate(inflater, container, false)
       return binding.root
   }

   override fun onResume() {
       super.onResume()
       binding.radioGroupTextSize.setOnCheckedChangeListener { group, checkedId ->
           preferencesEditor.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)
               }
           }
       }

   override fun onPause() {
       super.onPause()
       preferencesEditor.apply()
       Log.d("PREF", "TEXT SIZE SET TO ${mPreferences.getInt("TXTSZ", 12)}. ")
   }
}

.. Log.d() 用于确定问题发生在哪里,日志只说它是 12。似乎 SharedPreferences 没有保存该值,tt 也不会对目标片段产生任何影响旨在以更改的大小显示文本。我想知道 apply() 是否放置错误,所以我尝试在每个单选按钮行为之后放置它,这根本没有改善这种情况。

还有很多其他的值需要保存,但是计算出这一个意味着它们也可以工作,所以我在这里简化了代码。

提前感谢您的帮助!

【问题讨论】:

  • 可能您没有使用新值重新创建视图,您的旧实例仍在运行并显示旧值。
  • 您是否添加了断点以确保您的 putInt 代码被执行?
  • 我发现断点并没有停止代码执行,并检查了 sharedpreferences xml 它根本没有值;完全是空的!

标签: android kotlin


【解决方案1】:

解决了问题;它创建 xml 但没有在上面写任何东西。我仍然不知道为什么它会这样工作,也许(很可能)它是一个意大利面条代码,所以我只是输入了简单的代码来确认活动的工作。它不会在片段中,并进行了简单的更改来修复它。

lateinit var binding: OptionsLayoutBinding
   var preferencesEditor: SharedPreferences? = null
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       preferencesEditor = activity?.getSharedPreferences("pref", Context.MODE_PRIVATE)
   }

   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
       binding = OptionsLayoutBinding.inflate(inflater, container, false)
       return binding.root
   }

并在每个 putInt() 之后放置 .apply()。做了一个自定义函数,不再重复。

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2019-03-09
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多