Fragment中SharedPreferences读取值为null的问题求助
问题原因及解决方案
这个问题我之前开发Android的时候也踩过类似的坑,核心原因是Fragment的Context初始化时机不对,咱们一步步拆解:
问题根源
你在Fragment的成员变量位置直接写了:
var preference: SharedPreferences? = context?.getSharedPreferences("testPreference", 0)
这时候Fragment还没有完成和Activity的绑定(也就是还没走到onAttach()生命周期),context其实是null,导致preference变量也变成了null,后续调用preference?.getString()自然会返回null。
另外补充一句:你用的0其实就是Context.MODE_PRIVATE的常量值,这部分和Activity里的调用是一致的,不会导致读取失败,不用纠结这个点。
解决方案
有两种靠谱的处理方式,选哪种都可以:
1. 在onCreatePreferences方法内直接获取
把SharedPreferences的初始化放到onCreatePreferences里,这时候Fragment已经绑定了Activity,Context肯定可用,推荐用requireContext()来获取非空的Context:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences_profilesettings, rootKey) // 使用requireContext()确保Context非空,避免空安全隐患 val preference = requireContext().getSharedPreferences("testPreference", Context.MODE_PRIVATE) println(preference.getString("nameOfUser", "error")) }
2. 在onAttach()生命周期中初始化
如果需要在Fragment的多个方法里复用这个SharedPreferences实例,可以在onAttach()里完成初始化,这个方法是Fragment绑定到Activity的第一个生命周期回调,此时Context已经可用:
// 用lateinit修饰,避免空安全处理的麻烦 private lateinit var preference: SharedPreferences override fun onAttach(context: Context) { super.onAttach(context) preference = context.getSharedPreferences("testPreference", Context.MODE_PRIVATE) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences_profilesettings, rootKey) println(preference.getString("nameOfUser", "error")) }
总结
Fragment的Context不是一开始就存在的,必须等到它依附到Activity之后再去获取,避开在成员变量声明阶段直接初始化依赖Context的对象,就能解决这个读取失败的问题啦。
内容的提问来源于stack exchange,提问作者jamesxbrown
相关产品推荐
相关产品推荐

