android - getDefaultSharedPreferences(this) 在运行时生成空错误?
问题描述
我正在尝试在我的主要活动中设置一个侦听器以更改“force_dark”设置
val preferences = getDefaultSharedPreferences(this)
var listener: SharedPreferences.OnSharedPreferenceChangeListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
if (key == "force_dark") {
Toast.makeText(this,"config changed",Toast.LENGTH_SHORT).show()
}
}
override fun onResume() {
super.onResume()
preferences.registerOnSharedPreferenceChangeListener(listener)
}
override fun onPause() {
super.onPause()
preferences.unregisterOnSharedPreferenceChangeListener(listener)
}
我的测试代码在上面,但是虽然它可以编译,但它在“val preferences = getDefaultSharedPreferences(this)”上崩溃,并出现错误“java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName ()' 在空对象引用上"
我不明白为什么会发生这种情况,这是系统共享首选项,那么它怎么可能是 null ?谁能澄清我哪里出错了?
感谢您的帮助,我设法让它工作,但只是想检查它是否以“正确”的方式工作,我补充说
lateinit var preferences : SharedPreferences
lateinit var listener : SharedPreferences.OnSharedPreferenceChangeListener
一开始,然后
preferences = getDefaultSharedPreferences(this)
listener =
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
if (key == "force_dark") {
Toast.makeText(this,"config changed",Toast.LENGTH_SHORT).show()
}
}
在 onCreate 按照建议然后
override fun onResume() {
super.onResume()
preferences.registerOnSharedPreferenceChangeListener(listener)
}
override fun onPause() {
super.onPause()
preferences.unregisterOnSharedPreferenceChangeListener(listener)
}
就其本身而言,是否有更优雅的解决方案或者这是最好的方法?
解决方案
您试图Context
过早地使用您的活动。在实例初始化阶段,该活动尚未设置为上下文。
将getDefaultSharedPreferences()
调用移至onCreate()
Activity 生命周期中或更晚。
推荐阅读
- google-sheets - 匹配整个列的串联?
- date - I need to change the format of the date
- flutter - Flutter ChangeNotifier,重复条目以在 initState 方法中列出
- python - Python不输出ANSI颜色
- javascript - 在javascript中的某些条件下重复for循环迭代的最干净方法?
- javascript - Konva / Canvas 上未缩放的交互层
- amazon-web-services - 每个端点的 Lambda AWS 函数
- bash - 带有 Bash 的彩虹表
- mysql - 如何将 "_id": { "$oid": "5ec796a7868d607e00f4b18d" } 和 "time": 1590137305745 插入 mysql 表中?
- vba - VBA:如果单词表中的第一个单元格具有特定值,则执行操作,否则转到下一个表