getDefaultSharedPreferences(this) 在运行时生成空错误?
getDefaultSharedPreferences(this) generates null error at runtime?
我正在尝试在我的主 activity 中设置一个侦听器以更改“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:尝试在 null 上调用虚拟方法 'java.lang.String android.content.Context.getPackageName()'对象引用
我不明白为什么会这样,这是系统共享首选项,怎么可能为空?谁能澄清我哪里出错了?
谢谢你的帮助,我设法让它工作了,但我只是想检查一下它是否以“正确”的方式工作,我添加了
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)
}
就其本身而言,是否有更优雅的解决方案或者这是最好的方法?
您过早地尝试将 activity 用作 Context
。 activity 尚未在实例初始化阶段设置为上下文。
在 activity 生命周期中将 getDefaultSharedPreferences()
调用移至 onCreate()
或更晚的时间。
您应该在 onCreate()
中初始化 SharedPreferences
,其中 context
已经存在。
preferences = getDefaultSharedPreferences(this)
应该移到那里。
我正在尝试在我的主 activity 中设置一个侦听器以更改“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:尝试在 null 上调用虚拟方法 'java.lang.String android.content.Context.getPackageName()'对象引用
我不明白为什么会这样,这是系统共享首选项,怎么可能为空?谁能澄清我哪里出错了?
谢谢你的帮助,我设法让它工作了,但我只是想检查一下它是否以“正确”的方式工作,我添加了
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)
}
就其本身而言,是否有更优雅的解决方案或者这是最好的方法?
您过早地尝试将 activity 用作 Context
。 activity 尚未在实例初始化阶段设置为上下文。
在 activity 生命周期中将 getDefaultSharedPreferences()
调用移至 onCreate()
或更晚的时间。
您应该在 onCreate()
中初始化 SharedPreferences
,其中 context
已经存在。
preferences = getDefaultSharedPreferences(this)
应该移到那里。