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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:12:19